2010-04-05 14 views

Respuesta

24

una enumeración está garantizada a ser representado por un número entero, pero el tipo real (y su de signo) es dependiente de la implementación.

Puede forzar una enumeración de estar representado por un tipo firmado por dar uno de los enumeradores un valor negativo:

enum SignedEnum { a = -1 }; 

En C++ 0x, el tipo subyacente de una enumeración se puede especificar de forma explícita:

enum ShortEnum : short { a }; 

(C++ 0x también añade soporte para las enumeraciones de ámbito)

para completar, voy a añadir que, en La programación C Language, 2nd ed., los enumeradores se especifican como que tienen el tipo int (p 215). K & R no es el estándar C, por lo que no es normativo para los compiladores ISO C, pero sí es anterior al estándar ISO C, por lo que es al menos interesante desde un punto de vista histórico.

+1

¿Qué signatura realmente usa gcc? – osgx

+0

@osgx: Supongo que dependerá de la cantidad de enumeradores y el rango de sus valores. Realmente no lo sé –

+2

El estándar C también especifica que cada * constante de enumeración * tiene el tipo 'int'. Sin embargo, el término "constante de enumeración" se refiere a las constantes de valor declaradas dentro del bloque 'enum {}'. Una variable con un tipo 'enum' puede tener cualquier tipo de entero en C, p. podría ser un tipo más corto que 'int' si uno puede representar todos los valores. (GCC, por ejemplo, tiene una opción '-fshort-enums' para hacer precisamente esto.) – Arkku

0

Ésta es una vieja pregunta ... pero yo he encontrado esto:

typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015 
typedef enum {v0, v1, v2, v3} ENUMNAME; 

Se puede utilizar como un índice sin signo de 2 bits, por ejemplo:

typedef struct { 
    ENUMNAME i:2; 
} STRUCTNAME; 

Intenté en GCC ARM - no funciona.
Además, WinDbg muestra STRUCTNAME.i como número, no como v0-v3.