2012-12-07 3 views
5

Ich muss ein Array nach, wie viele Elemente die enum haben. Ich habe folgende:Kann enum member die Größe eines Arrays in ANSI-C haben?

enum { A, B, C, LAST }; 
char buf[LAST]; 

Das funktioniert gut, auch mit -ansi -pedantic Fahnen. Aber ich bin mir nicht sicher, ob es eine GCC oder Clang (welche die meisten, wenn nicht alle GCC-Erweiterungen unterstützt) Erweiterungen oder wirklich durch den ANSI C-Standard erlaubt und funktioniert gut in jedem C-Compiler mit ANSI-C Std. Kann jemand das klären?

Antwort

6

Die beiden Normen C89 (Abschnitt 3.5.2.2) und C99 (Abschnitt 6.7.2.2) sind definiert e Aufzählungen die gleiche Art und Weise:

6.7.2.2 Enumeration spezifischen ers (Absatz 3), http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

3.5.2.2 Enumeration Spezifizierer (Absatz 3), http://flash-gordon.me.uk/ansi.c.txt

Lese- :

[...] Ein Enumerator mit = de fi nes seine Aufzählungskonstante als Wert des konstanten Ausdrucks.Wenn der erste Enumerator kein = hat, ist der Wert seiner Enumerationskonstante 0. Jeder nachfolgende Enumerator mit no = definiert seine Enumerationskonstante als den Wert des Konstantenausdrucks, der durch Addition von 1 zum Wert der vorherigen Enumerationskonstante erhalten wird. [...]

Daher wird in Ihrer Syntax jeder standardkonforme Compiler Ihren Code korrekt ausführen.

2

Das funktioniert gut, auch mit -ansi -pedantic Flaggen

So ist es nicht eine GNU-Erweiterung. Ja, das ist in ANSI C in Ordnung, weil Mitglieder eines enum konstante Ausdrücke sind.

+0

Dies setzt voraus, dass GCC 100% standardkonform ist :-) –

1

Von C Standard, Absatz 6.2.5 (Typen):

16 Eine Aufzählung umfasst einen Satz von Namen integer konstante Werte. Jede einzelne Aufzählung bildet einen anderen aufgezählten Typ.

17 Der Typ char, die Integer-Typen mit und ohne Vorzeichen sowie die Aufzählungstypen werden gemeinsam Integer-Typen genannt.

Auch Absatz 6.7.2.2 (Enumeration Spezifizierer):

der Ausdruck, der den Wert eines Aufzählungskonstante definiert wird eine ganzzahlige Konstante Ausdruck sein, der einen Wert darstellbare als int hat.

2

Kann jemand das klären?

Ich bin sicher, Sie wissen, eine Enumeration nur ein Etikett auf eine Reihe appling:

enum 
{ A, // 0 
    B, // 1 
    C, // 2 
    LAST // 3 
}; 

Also wirklich:

char buf[LAST]; 

ist nicht anders als:

char buf[3]; 
2

Wie andere gesagt haben, ist es gültig. Aber ich denke, bisher hat noch niemand die richtigen Abschnitte zitiert. Die entsprechenden diejenigen aus dem N1256 C99 draft sind: 6.6 „Konstante Ausdrücke“ Ziffer 6:

Eine Integer-Konstante expression99) wird Integer-Typ haben und dürfen nur Operanden, die ganzzahlige Konstanten sind, Enumerationskonstanten [...]

und dann 6.7.5.2 „Array Deklaratoren“ Ziffer 4:

Wenn die Größe ein ganze Zahl konstanter Ausdruck ist, und der Elementtyp hat eine bekannte konstante Größe, der Array-Typ ist kein variabler Länge Array-Typ [...]

Also im Grunde:

  • Enumerationskonstanten konstante Ausdrücke sind
  • für das Array nicht mit variabler Länge zu sein, müssen wir einen konstanten Ausdruck

ich, dass 6.7.2.2 glauben " Aufzählungs-Spezifizierer, von denen andere zitierten, sprechen davon, dass enum deklariert wurde und die Aufzähler nicht verwendet wurden. Da Sie bei der Deklaration natürlich Kompilierzeitkonstanten benötigen, erwarten wir natürlich, dass sie auch Kompilierzeitkonstanten sind, wenn sie in Ausdrücken verwendet werden.

+1

Danke. Sie haben recht mit früheren Antworten, die nicht die richtigen Abschnitte aus dem Standard zitieren. Das Schlüsselkonzept war zu beweisen, dass ein Enum-Wert und die Größe eines Arrays zur Deklarationszeit genau die gleiche Art von Wert sind. – cesss

Verwandte Themen