Anzeichen von Enum in C/C99/C ++/C ++ x/gnu c/gnu c99
Frage
Ist enum
Typ signiert oder nicht signiert? Unterscheidet sich die Unterzeichnung von Enums in C/C99/ANSI C/C ++/C ++ x/gnu c/gnu c99?
Vielen Dank
Lösung
Es wird garantiert, dass eine Aufzündung durch eine Ganzzahl dargestellt wird, aber der tatsächliche Typ (und seine Unterzeichnung) ist implementierungsabhängig.
Sie können zwingen, dass eine Aufzählung durch einen signierten Typ dargestellt wird, indem Sie einem der Aufzähler einen negativen Wert geben:
enum SignedEnum { a = -1 };
In C ++ 0x kann der zugrunde liegende Typ einer Aufzählung explizit angegeben werden:
enum ShortEnum : short { a };
(C ++ 0x fügt auch Unterstützung für Scoped -Aufzählungen hinzu)
Zur Vollständigkeit werde ich das hinzufügen Die C -Programmiersprache, 2. Aufl., Aufzähler sind als Typ angegeben int
(S. 215). K & R ist nicht der C -Standard, also ist das für ISO -C -Compiler nicht normativ, aber es geht vor dem ISO -C -Standard aus, sodass es aus historischer Sicht zumindest interessant ist.
Andere Tipps
Dies ist eine alte Frage ... aber ich habe gerade das herausgefunden:
typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;
Sie können es als 2-Bit-Unsigned-Index verwenden, zum Beispiel:
typedef struct {
ENUMNAME i:2;
} STRUCTNAME;
Versuchte es in GCC -Arm - funktioniert nicht.
Auch Windbg zeigt StructName.i als Nummer, nicht als V0-V3.