2012-03-20 23 views
5
class Test 
{ 
    enum{}; 
    ... 
}; 

Questa definizione di enum vuota è portatile? Compilare in gcc ee msvc.È vuoto enum (enum {};) portatile?

+9

Cosa stai usando per? – Cameron

+0

In una macro che può avere un parametro vuoto –

+0

Che non è solo un enum vuoto, è un enum vuoto anonimo, che, come detto nelle altre risposte, è mal formato perché non dichiara nulla. Quindi, le enumerazioni vuote sono valute, che non sono valide sono enumerazioni vuote anonime. Si potrebbe dichiarare sia 'enum {A}' che 'enum e {}', che sono dichiarazioni valide. –

risposta

8

tale enumerazione è specificatamente elencata nella clausola 7 paragrafo 3 dello standard C++ come non formato. gcc non lo accetta. c'era un bug fix per questo in gcc:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29018

+1

Mi era mancato. La grammatica consente la forma, ma nell'intestazione del capitolo, vi è un divieto specifico di, in effetti, qualsiasi dichiarazione che non dichiari né un tipo né un'entità (variabile, funzione o riferimento). E dà proprio questo caso come esempio. –

+2

@Nawaz Il paragrafo citato da WeaselFox è presente in C++ 98, C++ 03 e C++ 11, invariato e con questo esatto esempio. –

4

Secondo il seguente frammento dallo standard C++ si può dedurre che è davvero una dichiarazione valida:

7,2/1 dichiarazioni di enumerazione (C++ 03)
...
enum-Prescrizione:
              enum identificatore opt {enumeratore-list opt}

Nota che sia il identificatore e il enumeratore-list sono opzionali, e per questo una dichiarazione come enum {} è valido (se chiedi lo standard).


Ma la norma non dice anche che le dichiarazioni vuote sono mal formate?

Sì, e c'è anche un esempio di enum { }; nello snippet di seguito dallo standard.

/3 Specificatori (C++ 03)

In questi casi e ogni volta che una classe specificatore o enum-specificatore è presente nel decl-specificatore-seq, gli identificatori in questi specificatori sono tra i nomi dichiarati dalla dichiarazione (come classe nomi, enum-nomi o enumeratori, a seconda della sintassi).

In questi casi, e fatta eccezione per la dichiarazione di un anonimo campo bit (9.6), il decl-specifier-ss introducono uno o più nomi nel programma, o sono ridichiarare un nome introdotto da una precedente dichiarazione .

* Esempio [

enum { };   // ill-formed 
typedef class { }; // ill-formed 

* esempio fine]


Conclusione

La dichiarazione sembra essere malato -formato dopo un attento esame dello standard, anche se i compilatori sono scritti da umani - e gli umani tendono a fare errori ea volte a trascurare le cose.


TL; DR Non dovrebbe usare una dichiarazione vuota come enum { };, anche se si compila

+0

Ma come sottolineato da WeaselFox, esiste un vincolo semantico generale, per le dichiarazioni __all__, in §7/​​3, che vieta effettivamente le dichiarazioni che non dichiarano nulla. Uno degli esempi che fornisce è 'enum {};'. –

+0

@JamesKanze risposta aggiornata, grazie per l'heads up mi sono completamente dimenticato di '7.1/3'. –

+0

@refp Anche me lo era mancato, finché WeaselFox non l'ha fatto notare. (E la sezione è §7/​​3, non §7.1/3.) –