c ++中的外部枚举

Tom*_*ear 8 c++ syntax compilation extern linkage

我有一个我在一些.h文件中声明的枚举:

typedef enum {
    NONE,
    ONE,
    TWO,
    THREE
} MYENUM;
Run Code Online (Sandbox Code Playgroud)

在一个单独的.cpp我不能这样做:

extern enum MYENUM; //works
extern MYENUM TWO; //makes sence, TWO is not an INSTANCE of MYENUM...
Run Code Online (Sandbox Code Playgroud)

怎么会这样做而不包括枚举枚举的整个标题?

Ben*_*igt 10

您不能使用不完整的类型.你只能传递指向它的指针.这是因为在类型完成之前,编译器不知道它有多大.OTOH指针是数据指针的大小,无论它指向什么类型.对于不完整类型,您无法做的事情之一是声明该类型的变量.

extern在变量声明中意味着编译器将发出对另一个编译单元中提供的标识符的引用(由链接器解析),而不是分配存储. extern不会修改类型,即使它出现在C++语法中的类型名称旁边.


你可以做的是利用枚举成员是整数常量值的事实,并将其转换为原始整数类型.

所以你可以这样做:

A.cpp

enum MYENUM { ONE=1, TWO, THREE };
int var = TWO;
Run Code Online (Sandbox Code Playgroud)

B.cpp

extern int var;
Run Code Online (Sandbox Code Playgroud)

但类型必须匹配.你不能说MYENUM var = TWO;也是extern int var;.这将违反单一定义规则(链接器可能会或可能不会检测到违规).


另外,这是不正确的:

typedef enum {
    NONE,
    ONE,
    TWO,
    THREE
} MYENUM;
enum MYENUM TWO;
Run Code Online (Sandbox Code Playgroud)

MYENUM不是枚举标识符.它是一个typedef,enum以后不能用关键字限定.