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 ?

¿Fue útil?

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.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top