Pregunta

Es enum tipo firmado o sin firmar? ¿La firma de los enums difiere en C/C99/ANSI C/C ++/C ++ X/GNU C/GNU C99?

Gracias

¿Fue útil?

Solución

Se garantiza que un enumio estará representado por un entero, pero el tipo real (y su firma) depende de la implementación.

Puede obligar a una enumeración a ser representada por un tipo firmado al darle a uno de los enumeradores un valor negativo:

enum SignedEnum { a = -1 };

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

enum ShortEnum : short { a };

(C ++ 0x también agrega soporte para enumeraciones de alcance)

Para completar, agregaré eso en El lenguaje de programación C, 2ª ed., se especifican los enumeradores como un tipo int (p. 215). K&R no es el estándar C, por lo que no es normativo para los compiladores ISO C, pero es anterior al estándar ISO C, por lo que es al menos interesante desde un punto de vista histórico.

Otros consejos

Esta es una vieja pregunta ... pero acabo de descubrir esto:

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

Puede usarlo como un índice sin firmar de 2 bits, por ejemplo:

typedef struct {
  ENUMNAME i:2;
} STRUCTNAME;

Lo probé en el brazo GCC, no funciona.
Además, WindBG muestra structName.i como un número, no como V0-V3.

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