傳說中的enum關鍵字
無論是c語言,仍是c++語言, 其中都有enum關鍵字。這是這兩種語言的基礎知識中都會涉及到的點。c++
其具體定義方法以下:安全
enum my_enum
{
my_enum1 = 0,
my_enum2,
};
固然也能夠省略 enum的名字,使用匿名的方式定義枚舉,以下所示:ui
enum
{
my_enum1 = 0,
my_enum2,
};
或者與 ‘typedef’ 關鍵字聯合使用,如:.net
typedef enum
{
my_enum1 = 0,
my_enum2,
}my_enum;
2. 傳統enum關鍵字存在的問題
全局做用域
傳統的enum關鍵字的做用域是全局的,也就是說,若是在enum A中聲明的一個枚舉類型my_enum3,沒法在enum B中聲明一樣的枚舉類型,具體的就是,以下的寫法是錯誤的,會出現編譯錯誤(會報 重定義錯誤)c++11
enum A
{
my_enum3 = 0,
};blog
enum B
{
my_enum3 = 0,
};
能隱式轉換爲其餘類型(如整型)
具體以下面的代碼所示:內存
enum my_enum
{
my_enum1 = 0,
my_enum2,作用域
};編譯
int my_int = my_enum1;
沒法指定底層使用的數據類型
也就是說,沒法明確的知道,一個枚舉類型,佔用內存的字節數,這樣在結構體中使用enum的時候就可能遇到麻煩, 特別是結構體須要內存對齊或者填充處理的時候問題就尤其突出了。ast
3. 奇妙的enum class,enum struct組合
在c++11標準中,除了傳統的enum關鍵字以外, 還新增了一個概念: enum class, enum struct組合的形式(二者是等價的),固然單純的enum關鍵字和enum class組合並不衝突,都能使用。 這一組合的出現就是爲了解決傳統enum關鍵字面臨的問題。
enum class組合具備class封裝性的特性,做用域是肯定的
enum class A
{
my_enum3 = 0,
};
enum class B
{
my_enum3 = 0,
};
enum C
{
my_enum3 = 0,
};
如上面這樣聲明和定義枚舉就是正確的,要訪問A和B中的枚舉是須要加上做用域的,形如:
A a = A::my_enum3;
B b = B::my_enum3;
能夠指定底層數據類型
enum class A: int /** 每一個枚舉都是int類型的 */
{
my_enum3 = 0,
};
enum class B: unsigned char /** 每一個枚舉都是unsigned char類型的 */
{
my_enum3 = 0,
};
不能隱式轉換
int my_int = A::my_enum3; /** 錯誤,沒法經過編譯 */
int my_int = static_cast<int>(A::my_enum3); /** 正確, 能夠經過編譯 */
4. 總結
enum class, enum struct組合的出現能夠極大的增長枚舉類型使用的靈活性,安全性以及易用性。
好比,在項目中枚舉較多的時候,爲了區分,每每會將 每一個枚舉的長度, 好比 A_MODULE_B_TYPE_C等等, 若是使用enum class組合的話,只須要在定義以下定義:
enum class AModuleBType: uint8_t
{
c = 0,
};
AModuleBType type = AModuleBType::c; /** 具體使用形式 */
這樣在枚舉中就只須要關注枚舉表明的內容,不須要去區分前綴或是否重定義等問題。
原文:https://blog.csdn.net/xuanwolanxue/article/details/79801038