Non è possibile utilizzare un tipo incompleto. Puoi solo passare intorno a dei puntatori. Questo perché finché il tipo non è completato, il compilatore non sa quanto è grande. OTOH un puntatore è la dimensione di un puntatore di dati, indipendentemente dal tipo a cui punta. Una delle cose che non puoi fare con un tipo incompleto è dichiarare variabili di quel tipo.
extern
in una dichiarazione di variabile significa che il compilatore emetterà un riferimento a un identificatore fornito in un'altra unità di compilazione (da risolvere dal linker), invece di allocare memoria. extern
non modifica il tipo, anche se appare accanto al nome del tipo nella grammatica C++.
Che cosa si può fare è prendere vantaggio dal fatto che i membri enum sono valori costanti integrali, e convertire bene per i tipi integrali primitivi.
Così si può fare questo:
A.cpp
enum MYENUM { ONE=1, TWO, THREE };
int var = TWO;
B.cpp
extern int var;
Ma i tipi devono corrispondere. Non si può dire MYENUM var = TWO;
e anche extern int var;
. Ciò violerebbe la regola della definizione unica (la violazione potrebbe o non potrebbe essere rilevata dal linker).
Per inciso, questo non è corretto:
typedef enum {
NONE,
ONE,
TWO,
THREE
} MYENUM;
enum MYENUM TWO;
MYENUM
NON è un identificatore enum. È un typedef e non può essere qualificato con la parola chiave enum
in seguito.
fonte
2011-03-07 19:38:14
Per utilizzare i membri di enum devono essere visibili dall'unità di compilazione. Ciò significa che è necessario includere i file di intestazione. –
Non sta provando a usare i membri, AFAICS. –