10

I have an enum I have declared in some .h file:

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

in a seperate .cpp I cannot do this:

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

how would one do so without including the whole header where the enum is declared?

4

2 回答 2

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关键字限定。

于 2011-03-07T19:38:14.180 回答
4

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

于 2011-03-07T19:38:14.587 回答