Ich erstelle eine Reihe 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 eine int; aber ich dachte, ich hätte irgendwo gelesen, dass (zumindest in GCC) der Compiler die Aufzählung beliebig breit machen kann, um ihre Werte zu halten. Ist es also möglich, eine Aufzählung mit einer Breite von 64 Bit zu haben?
140
Antworten:
An
enum
ist garantiert nur groß genug, umint
Werte aufzunehmen. Dem Compiler steht es frei, den tatsächlich verwendeten Typ basierend auf den definierten Aufzählungskonstanten auszuwä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 eine passen, müssenint
Sie dazu compilerspezifische Erweiterungen verwenden.quelle
enum
größer als einint
oder kleiner sein sollte? Nach der Antwort von @MichaelStum sollte Ihr erster Satz lauten: "Anenum
passt garantiert nur in einenint
Wert."int
. Die Antwort von Michael Stum , die sich auf C99 bezieht, besagt, dass eine Aufzählung so klein sein kann wie einechar
.enum
ist garantiert nur groß genug, um den Wert des größten Enumerators in der Enumeration aufzunehmen.Entnommen aus dem aktuellen C-Standard (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Nicht, dass Compiler gut darin sind, dem Standard zu folgen, aber im Wesentlichen: Wenn Ihre Aufzählung etwas anderes als ein int enthält, befinden Sie sich in einem tiefen "nicht unterstützten Verhalten, das Sie in ein oder zwei Jahren zurückbeißen kann".
quelle
int
.short
undlong
sind auch ganzzahlige Typen, und unabhängig von der Auswahl der Implementierung müssen alle Werte passen (" muss in der Lage sein, die Werte aller Mitglieder der Aufzählung darzustellen").int
, könnte die tatsächliche Aufzählungsvariable ein anderer Typ sein. Dies ist eine bekannte Inkonsistenz im Standard.enum my_enum { my_value }
hatmy_value
einen Typint
,enum my_enum
kann aber einen implementierungsdefinierten Typ haben, der mindestens alle Aufzählungswerte darstellen muss. Esmy_value
kann also zu einer Verengung der Konvertierung kommenenum my_enum
, aber es wird garantiert nicht überlaufen.Während die vorherigen Antworten korrekt sind, haben einige Compiler Optionen, um den Standard zu brechen und den kleinsten Typ zu verwenden, der alle Werte enthält.
Beispiel mit GCC (Dokumentation im GCC-Handbuch ):
quelle
Setzen Sie einfach den letzten Wert der Aufzählung auf einen Wert, der groß genug ist, um die Größe zu erreichen, die die Aufzählung haben soll. Dann sollte sie folgende Größe haben:
quelle
Wir haben keine Kontrolle über die Größe einer
enum
Variablen. Dies hängt vollständig von der Implementierung ab, und der Compiler bietet die Möglichkeit, einen Namen für eine Ganzzahl mit zu speichernenum
, sodass erenum
der Größe einer Ganzzahl folgt.quelle
In der C-Sprache hat ein
enum
garantiert die Größe einesint
. Es gibt eine Option-fshort-enums
zur Kompilierungszeit ( ), um sie so kurz wie möglich zu halten (Dies ist hauptsächlich nützlich, wenn die Werte nicht mehr als 64 KB betragen). Es gibt keine Option zur Kompilierungszeit, um die Größe auf 64 Bit zu erhöhen.quelle
Betrachten Sie diesen Code:
Es wird 4 als Ausgabe geben. Unabhängig von der Anzahl der enthaltenen Elemente
enum
ist die Größe immer festgelegt.quelle