2012-12-07 13 views
5

Ho bisogno di allocare un array in base a quanti elementi hanno il enum. Ho fatto la seguente:Un membro enum può avere le dimensioni di un array in ANSI-C?

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

Che funziona bene, anche con -ansi -pedantic bandiere. Ma non sono sicuro che sia un GCC o clang (che supporta la maggior parte, se non tutte le estensioni di GCC) o permesso dallo standard ANSI C e funzionerà bene in qualsiasi compilatore C con ANSI-C std. Qualcuno può chiarirlo?

risposta

6

Entrambi gli standard C89 (sezione 3.5.2.2) e C99 (sezione 6.7.2.2) definiscono e le enumerazioni allo stesso modo:

6.7.2.2 enumerazione speci fi ers (paragrafo 3), http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

3.5.2.2 prescrittori enumerazione (paragrafo 3), http://flash-gordon.me.uk/ansi.c.txt

sia in lettura :

[...] Un enumeratore con = de fi nes la sua numerazione costante come valore dell'espressione costante.Se il primo enumeratore non ha =, il valore della sua costante di enumerazione è 0. Ogni enumeratore successivo con no = definisce la costante di enumerazione come il valore dell'espressione costante ottenuta aggiungendo 1 al valore della costante di enumerazione precedente. [...]

Pertanto, nella sintassi, qualsiasi compilatore conforme allo standard eseguirà correttamente il codice.

2

Che funziona bene, anche con le bandiere -pedantic -ansi

quindi non è un'estensione GNU. Sì, questo va bene in ANSI C, perché i membri di un enum sono espressioni costanti.

+0

Questo suppone che GCC sia conforme allo standard al 100% :-) –

1

Da C standard, paragrafo 6.2.5 (tipi):

16 un'enumerazione comprende un insieme di valori interi di nome costanti. Ogni enumerazione distinta costituisce un tipo enumerato diverso.

17 Il tipo char, i tipi interi con segno e senza segno e i tipi enumerati sono chiamati collettivamente tipi interi.

Inoltre, paragrafo 6.7.2.2 (specificatori Enumeration):

L'espressione che definisce il valore di una costante di enumerazione sono essere un'espressione costante intera che ha un valore rappresentabile come int.

2

Qualcuno può chiarirlo?

Sono sicuro che voi sapete, un enum è solo Appling un'etichetta a un numero:

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

Quindi, in realtà:

char buf[LAST]; 

non è diverso:

char buf[3]; 
2

Come altri hanno già detto, è valido. Ma penso che nessuno abbia citato le sezioni giuste finora. Quelli rilevanti dal N1256 C99 draft sono: 6.6 "Le espressioni costanti" paragrafo 6:

una costante intera expression99) avranno tipo intero e devono avere solo operandi che sono costanti intere, le costanti di enumerazione [...]

e poi 6.7.5.2 "dichiaratori Array" paragrafo 4:

Se la dimensione è un numero intero costante espressione e il tipo di elemento ha una dimensione costante noto, il tipo di matrice non è un tipo di matrice di lunghezza variabile [...]

Quindi, fondamentalmente:

  • costanti di enumerazione sono espressioni costanti
  • per l'array di non essere di lunghezza variabile, abbiamo bisogno di un'espressione costante

Credo che 6.7.2.2 " Gli specificatori di enumerazione "che altri citano parlano della dichiarazione dello enum, non utilizzando gli enumeratori. Naturalmente, dal momento che dichiararli richiede costanti di tempo di compilazione, ci aspettiamo che siano anche costanti di tempo di compilazione quando vengono utilizzate nelle espressioni.

+1

Grazie. Hai ragione riguardo alle risposte precedenti, non citando le sezioni corrette dallo standard. Il concetto chiave era dimostrare che un valore enum e la dimensione di un array al momento della dichiarazione sono esattamente lo stesso tipo di valore. – cesss

Problemi correlati