c++ - name - typedef enum c
extern enum en c++ (2)
No puede usar 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?
Tengo una enumeración que he declarado en algún archivo .h:
typedef enum {
NONE,
ONE,
TWO,
THREE
} MYENUM;
en un .cpp separado no puedo hacer esto:
extern enum MYENUM; //works
extern MYENUM TWO; //makes sence, TWO is not an INSTANCE of MYENUM...
¿Cómo podría uno hacerlo sin incluir el encabezado completo donde se declara la enumeración?
No puedes 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 aprovechar el hecho de que los miembros enum son valores constantes integrales y se convierten perfectamente en los tipos integrales primitivos.
Entonces puedes hacer esto:
A.cpp
enum MYENUM { ONE=1, TWO, THREE };
int var = TWO;
B.cpp
extern int var;
Pero los tipos deben coincidir. No podrías 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 un lado, esto es incorrecto:
typedef enum {
NONE,
ONE,
TWO,
THREE
} MYENUM;
enum MYENUM TWO;
MYENUM
NO es un identificador enum. Es un typedef y no se puede calificar con la palabra clave enum
más adelante.