【问题标题】:Enum forward declaration vs. header files枚举前向声明与头文件
【发布时间】:2018-09-15 23:09:04
【问题描述】:

在 LearnCPP CH4.5 枚举类型中,它声明了

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

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

【问题讨论】:

  • 在这种情况下,没有枚举“前向声明”。相反,相同的定义在所有包含所述标头的源文件之间共享​​>。
  • “前向声明”不是官方术语。意思是你可以在 header 中define 一个枚举。在 cpp 文件中定义它并没有什么不同,但有助于避免在不同文件中以不同方式定义相同枚举等错误

标签: c++ enums forward-declaration


【解决方案1】:

这里的陈述实际上并不是关于枚举的声明位置,而是关于声明和定义之间的区别。

类似

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

struct Foo {
    MyEnum value;
};

编译失败,因为编译器不能仅从声明中确定MyEnum 的大小,但需要该大小来确定上面sn-p 中定义的结构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;
};

编译得很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2011-11-20
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多