枚举转发声明与头文件

时间:2018-09-15 23:09:04

标签: c++ enums forward-declaration

在LearnCPP CH4.5枚举类型中,它指出

  

由于编译器需要知道为枚举分配多少内存,因此无法转发声明的枚举类型。但是,有一个简单的解决方法。因为定义枚举不会分配任何内存,所以如果在多个文件中需要枚举,则可以在标头中定义枚举,并在需要时#include该标头。

我认为头文件是前向声明的集合,但只是在一个单独的文件中。那么为什么在头文件中声明枚举类型与在同一文件中正使用声明枚举类型有所不同呢?

1 个答案:

答案 0 :(得分:3)

这里的声明不是真正关于枚举的声明位置,而是声明和定义之间的区别。

类似

enum MyEnum; // just a declaration, not a definition

struct Foo {
    MyEnum value;
};

编译失败,因为编译器无法仅从声明中确定MyEnum的大小,而是需要该大小来确定上面代码段中定义的结构Foo的大小。

这与类似的东西相反

// the following is both a declaration and a defintion of the enum `MyEnum`
enum MyEnum {
    your,
    enumerators,
    go,
    here
};

struct Foo {
  MyEnum value;
};

之所以进行编译,是因为编译器现在拥有确定结构Foo的大小所需的所有信息。

但是,您引用的来源似乎有点过时了。从C ++ 11开始,只要知道枚举的大小就可以满足声明,即因为您明确指定了无范围的枚举的基础类型(例如enum MyEnum : unsigned int;),或者因为您使用了范围限定的枚举,默认情况下,使用int作为其基础类型。那是

enum MyEnum : int; // declaration only, but with specified underlying type
enum class Bar;  // also only declaration, `int` is implicit underlying type

struct Foo {
    MyEnum v1;
    Bar v2;
};

编译就可以了。