c ++中的外部枚举

时间:2011-03-07 19:20:39

标签: c++ syntax compilation extern linkage

我有一个我在一些.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...

如果没有包含声明枚举的整个标题,怎么会这样做?

2 个答案:

答案 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)

如果枚举值不可见,则无法使用它们。如果标题太大而无法包含,为什么不将枚举放在自己的标题中,只包括它?