2012-12-07 16 views
5

Potrzebuję przydzielić tablicy, zgodnie z liczbą elementów, które ma enum. Zrobiłem następujące:Czy element enum może być wielkością tablicy w ANSI-C?

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

To działa dobrze, nawet z flagami -ansi -pedantic. Ale nie jestem pewien, czy jest to GCC lub clang (który obsługuje większość, jeśli nie wszystkie rozszerzenia GCC) lub naprawdę dozwolone przez standard ANSI C i będzie działać dobrze w każdym kompilatorze C ze stacją ANSI-C. Czy ktoś może to wyjaśnić?

Odpowiedz

6

Zarówno standardy C89 (sekcja 3.5.2.2), jak i C99 (sekcja 6.7.2.2) e wyliczenia taki sam sposób:

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

3.5.2.2 Enumeration specyfikatorów (§ 3), http://flash-gordon.me.uk/ansi.c.txt

zarówno odczytu :

[...] Moduł wyliczający z = definicjami jego stała wyliczeniowa jako wartość wyrażenia stałego.Jeśli pierwszy moduł wyliczający nie ma =, wartość jego stałej wyliczeniowej wynosi 0. Każdy kolejny moduł wyliczający o wartości = nie określa swojej stałej wyliczeniowej jako wartość stałego wyrażenia uzyskanego przez dodanie 1 do wartości poprzedniej stałej wyliczeniowej. [...]

W związku z tym, w Twojej składni, każdy zgodny ze standardem kompilator uruchomi twój kod poprawnie.

2

To działa dobrze, nawet z -ansi -pedantic flagi

Więc nie jest to rozszerzenie GNU. Tak, w ANSI C wszystko jest w porządku, ponieważ członkowie enum są wyrażeniami stałymi.

+0

To zakłada, że ​​GCC jest w 100% zgodny z normą :-) –

1

Od C Standard, pkt 6.2.5 (typy):

16 wyliczenie zawiera zestaw nazwanych wartości całkowitych stałych. Każde odrębne wyliczenie stanowi inny typ wyliczeniowy.

17 Typ char, podpisane i bez znaku liczby całkowite, a typy wyliczeniowe są zbiorczo nazywane rodzajami całkowitymi.

również (akapit 6.7.2.2 Specyfikatory Wyliczenie):

Wyrażenie, że określa się wartość stałej wyliczenie musi być liczbą całkowitą stałej ekspresji, który ma być reprezentowana wartość jako int.

2

Czy ktoś może to wyjaśnić?

Jestem pewien, że wiesz, enum jest tylko Appling etykietę z numerem:

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

Tak naprawdę:

char buf[LAST]; 

nie jest inaczej niż:

char buf[3]; 
2

Jak powiedzieli inni, jest to ważne. Ale sądzę, że nikt dotąd nie cytował odpowiednich sekcji. Odpowiednie te z N1256 C99 draft są: 6.6 „wyrażenia Constant” ustęp 6:

całkowita stała expression99) mają całkowitą typ i mają jedynie argumenty, które są stałymi całkowite, stałe wyliczeniowe [...]

i 6.7.5.2 „declarators array” ust 4:

Jeżeli rozmiar stałą całkowitą ekspresję i typ elementu jest znaną wartością stałą wielkość, rodzaju tablica nie jest macierzowych zmiennej długości [...]

Więc zasadniczo:

  • Stałe wyliczeniowe są stałe wyrażenia
  • do tablicy, aby nie być zmienna długość, musimy stałą ekspresję

wierzę, że 6.7.2.2 " Specyfikatory wyliczeń ", o których inni mówili, mówią o deklarowaniu enum, nie używając modułów wyliczających. Oczywiście, od kiedy deklarując je, potrzebujesz stałych czasowych kompilacji, spodziewamy się, że powinny one również być stałymi w czasie kompilacji, gdy są używane w wyrażeniach.

+1

Dzięki. Masz rację co do poprzednich odpowiedzi, nie cytując właściwych sekcji ze standardu. Kluczową koncepcją było udowodnienie, że wartość wyliczeniowa i rozmiar tablicy w momencie deklaracji są dokładnie tego samego rodzaju. – cesss

Powiązane problemy