我有一个我在一些.h文件中声明的枚举:
typedef enum {
NONE,
ONE,
TWO,
THREE
} MYENUM;
单独.cpp我不能这样做:
extern enum MYENUM; //works
extern MYENUM TWO; //makes sence, TWO is not an INSTANCE of MYENUM...
如果没有包含声明枚举的整个标题,怎么会这样做?
答案 0 :(得分:10)
您不能使用不完整的类型。你只能传递指向它的指针。这是因为在类型完成之前,编译器不知道它有多大。 OTOH指针是数据指针的大小,无论它指向什么类型。你不能用不完整类型做的事情之一是声明该类型的变量。
变量声明中的 extern
表示编译器将发出对另一个编译单元中提供的标识符的引用(由链接器解析),而不是分配存储。 extern
不会修改类型,即使它出现在C ++语法中的类型名称旁边。
你可以做的是利用枚举成员是整数常量值的事实,并将其转换为原始整数类型。
所以你可以这样做:
A.cpp
enum MYENUM { ONE=1, TWO, THREE };
int var = TWO;
B.cpp
extern int var;
但是类型必须匹配。你不能说MYENUM var = TWO;
和extern int var;
。这会违反单一定义规则(链接器可能会或可能不会检测到违规行为)。
顺便说一句,这是不正确的:
typedef enum {
NONE,
ONE,
TWO,
THREE
} MYENUM;
enum MYENUM TWO;
MYENUM
不是枚举标识符。它是一个typedef,以后无法使用enum
关键字进行限定。
答案 1 :(得分:3)
如果枚举值不可见,则无法使用它们。如果标题太大而无法包含,为什么不将枚举放在自己的标题中,只包括它?