reemplazar la enumeración de tipo base el uso de pragma o cambio de código
Pregunta
Problema:
Estoy utilizando una gran C/C++ base de código que funciona en gcc & visual studio compiladores donde enum tipo base es por defecto de 32 bits(de tipo entero).
Este código también tiene un montón de en línea + incrustado asamblea, que trata de la enumeración como de tipo entero y datos de enumeración se utiliza como de 32 bits de banderas en muchos casos.
Cuando se compila este código con realview BRAZO RVCT 2.2 compilador, empezamos a tener muchos problemas ya que realview compilador decide tipo base de la enumeración de forma automática basándose en el valor de una enumeración se establece. http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm
Por ejemplo,
Considere la siguiente enumeración,
enum Scale {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
Esta enumeración se utiliza como una versión de 32 bits de la bandera.pero compilador optimiza a unsigned char tipo enum.
Usando --enum_is_int opción de compilador no es una buena solución para nuestro caso, ya que convierte todos los enumeración de 32 bits que se va a romper la interacción con cualquier código externo compilado sin --enum_is_int.
Esta es la advertencia que he encontrado en la RVCT compiladores y bibliotecas la guía,
El --enum_is_int opción no está se recomienda para uso general y no necesarios para la ISO compatible con la fuente.El código compilado con esta opción no está compatible con la ABI para el BRAZO Arquitectura (base estándar) [BSABI], y uso incorrecto podría resultar en un error en tiempo de ejecución.Esta opción no está apoyado por las bibliotecas de C++.
Pregunta
Cómo convertir todos los enumeración del tipo base (a mano, por los cambios codificados) para el uso de 32 bits sin afectar el valor de los pedidos?
enum Scale {
TimesOne=0x00000000,
TimesTwo, // 0x00000001
TimesFour, // 0x00000002
TimesEight, //0x00000003
};
He probado el cambio anterior.Pero compilador optimiza esto también para nuestra mala suerte.:(
Hay algunos de la sintaxis .NET como
enum Escala:int
Es este un ISO estándar de C++ y el BRAZO compilador carece de ella?
No hay #pragma para el control de esta enumeración en el BRAZO RVCT 2.2 compilador.¿Hay algún oculto pragma disponible ?
Solución
Yo sé que muchos de los encabezados de Windows utilizan la siguiente:
enum SOME_ENUM {
ONE = 1,
TWO = 2,
//...
FORCE_DWORD = 0x7FFFFFFF
};
Otros consejos
En C ++ 11:
enum class Scale : uint32_t {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
Visual Studio 2012 y gcc 4.4.6 con el -std = C ++ 0x opción tanto apoyar esto (las versiones anteriores pueden también.)