2011-03-07 17 views
8

tengo una enumeración he declarado en algún archivo .h:enumeración extern en C++

typedef enum { 
    NONE, 
    ONE, 
    TWO, 
    THREE 
} MYENUM; 

en un .cpp independiente que no puedo hacer esto:

extern enum MYENUM; //works 
extern MYENUM TWO; //makes sence, TWO is not an INSTANCE of MYENUM... 

¿cómo se lo hacen sin incluyendo el encabezado completo donde se declara la enumeración?

+2

Para usar los miembros enum, deben poder verse desde la unidad de compilación. Esto significa que debe incluir los archivos de encabezado. –

+0

No está tratando de usar los miembros, AFAICS. –

Respuesta

10

No puede usar un tipo incompleto. Solo puedes pasar punteros a él. Esto es porque hasta que se complete el tipo, el compilador no sabe qué tan grande es. OTOH un puntero es del tamaño de un puntero de datos, sin importar de qué tipo esté apuntando. Una de las cosas que no puede hacer con un tipo incompleto es declarar variables de ese tipo.

extern en una declaración de variable significa que el compilador emitirá una referencia a un identificador provisto en otra unidad de compilación (para ser resuelto por el vinculador), en lugar de asignar almacenamiento. extern no modifica el tipo, incluso si aparece junto al nombre del tipo en la gramática C++.


Lo que puede hacer es tomar ventaja del hecho de que los miembros de enumeración son valores constantes integrales, y convertir bien a los tipos integrales primitivas.

Así que usted puede hacer esto:

a.cpp

enum MYENUM { ONE=1, TWO, THREE }; 
int var = TWO; 

B.cpp

extern int var; 

Pero los tipos deben coincidir. No puede decir MYENUM var = TWO; y también extern int var;. Eso violaría la regla de una definición (la violación podría o no ser detectada por el enlazador).


Como acotación al margen, esto es incorrecto:

typedef enum { 
    NONE, 
    ONE, 
    TWO, 
    THREE 
} MYENUM; 
enum MYENUM TWO; 

MYENUM no es un identificador de enumeración. Es un typedef y no puede calificarse con la palabra clave enum más adelante.

2

No puede usar los valores enum, si no son visibles. Si el encabezado es demasiado grande para incluir, ¿por qué no simplemente poner la enumeración en su propio encabezado e incluir solo eso?