簡體   English   中英

枚舉轉發聲明與頭文件

[英]Enum forward declaration vs. header files

在LearnCPP CH4.5枚舉類型中,它指出

因為編譯器需要知道為枚舉分配多少內存,所以您不能轉發聲明的枚舉類型。 但是,有一個簡單的解決方法。 因為定義枚舉不會分配任何內存,所以如果在多個文件中需要枚舉,則可以在標頭中定義枚舉,並在需要時#include該標頭就可以了。

我認為頭文件是前向聲明的集合,但僅在一個單獨的文件中。 那么,為什么在頭文件中聲明枚舉類型與在同一文件中正使用聲明枚舉類型有所不同呢?

這里的聲明並不是真正關於枚舉的聲明位置,而是聲明和定義之間的區別。

就像是

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

struct Foo {
    MyEnum value;
};

無法編譯,因為編譯器無法僅通過聲明來確定MyEnum的大小,而是需要該大小來確定上面代碼段中定義的struct Foo的大小。

這與類似

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

struct Foo {
  MyEnum value;
};

之所以進行編譯,是因為編譯器現在具有確定struct 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;
};

編譯就好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM