­

c++11:枚舉類型(enum)的前向聲明(forward declaration)

  • 2020 年 3 月 26 日
  • 筆記

在C++11之前,C++標準是不支持枚舉類型的前向聲明的。我說出這個結論,肯定有用msvc的童鞋不願意了:口胡,MSVC明明就可以對枚舉類型前向聲明,下面這樣的前向聲明在MSVC下好好的,沒有任何問題。

enum E;

是哦,你說的對,MSVC下上面的寫法的確是沒問題,那因為MSVC提供了這個特徵,但放在gcc下編譯試試,立即報錯:

use of enum E without previous declaration

因為C++98標準中沒有支持枚舉類型前向聲明,所以就不能保證上面的寫法對任何編譯器都行。為什麼枚舉類型不能被前向聲明呢? 因為編譯器無法知道枚舉變量所需的存儲空間。 在編譯期,C ++編譯器要為變量保留存儲空間。 如果所有可見的都是前向聲明,那麼編譯器無法知道選擇哪種存儲大小 – 它可能是char,word或int,或其他。

在C++11中通過下面的語法指定了變量存儲空間大小,就可以支持前向聲明了:

enum E : unsigned int ;

參考資料: 《Enum Forward Declaration》 https://stackoverflow.com/questions/15141248/enum-forward-declaration/15144087

https://en.cppreference.com/w/cpp/language/enum