it-swarm.com.de

Wie groß ist eine Aufzählung in C?

Ich erstelle einen Satz von Aufzählungswerten, aber jeder Aufzählungswert muss 64 Bit breit sein. Wenn ich mich richtig erinnere, hat eine Aufzählung im Allgemeinen die gleiche Größe wie ein int. aber ich dachte, ich habe irgendwo gelesen, dass (zumindest in GCC) der Compiler die Enumenzahl beliebig breit machen kann, um ihre Werte zu speichern. Ist es also möglich, eine Aufzählung zu haben, die 64 Bit breit ist?

128
mipadi

Ein enum ist nur garantiert groß genug, um int-Werte aufzunehmen. Der Compiler kann den tatsächlich verwendeten Typ basierend auf den definierten Enumerationskonstanten frei wählen, sodass er einen kleineren Typ auswählen kann, wenn er die von Ihnen definierten Werte darstellen kann. Wenn Sie Aufzählungskonstanten benötigen, die nicht in int passen, müssen Sie compilerspezifische Erweiterungen verwenden.

90
Robert Gamble

Aus dem aktuellen C-Standard (C99) entnommen: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 Aufzählungsspezifizierer
[...]
Einschränkungen
Der Ausdruck, der den Wert einer Aufzählungskonstante definiert, muss eine ganze Zahl sein konstanter Ausdruck, dessen Wert als int dargestellt werden kann.
[...]
Jeder aufgezählte Typ muss mit char, einem vorzeichenbehafteten Integer-Typ oder einem .__ kompatibel sein. vorzeichenloser Integer-Typ Die Auswahl des Typs ist implementierungsdefiniert, muss jedoch __ sein. die Werte aller Mitglieder der Aufzählung darstellen kann.

Nicht dass Compiler dem Standard wirklich gut folgen können, aber im Wesentlichen: Wenn Ihre Enummen etwas anderes als ein int enthalten, sind Sie in einem tiefen "nicht unterstützten Verhalten", das Sie vielleicht in ein oder zwei Jahren beißt. 

84
Michael Stum

Während die vorherigen Antworten richtig sind, haben einige Compiler Optionen, um den Standard zu brechen und den kleinsten Typ zu verwenden, der alle Werte enthält.

Beispiel mit GCC (Verdoppelung in im GCC-Handbuch ):

enum ord __attribute__ ((__packed__)) {
    FIRST = 1,
    SECOND,
    THIRD
};
STATIC_ASSERT( sizeof(enum ord) == 1 )
13
Kevin Cox

In der Sprache C wird garantiert, dass eine enum die Größe von int hat. Es gibt eine Option zum Kompilieren (-fshort-enums), um es kurz zu machen (Dies ist vor allem nützlich, wenn die Werte nicht mehr als 64 KB betragen). Es gibt keine Option zum Kompilieren, um die Größe auf 64 Bit zu erhöhen.

0
rashok