奇妙的enum class,enum struct組合


傳說中的enum關鍵字
不管是c語言,還是c++語言, 其中都有enum關鍵字。這是這兩種語言的基礎知識中都會涉及到的點。

其具體定義方法如下:

enum my_enum
{
my_enum1 = 0,
my_enum2,
};
當然也可以省略 enum的名字,使用匿名的方式定義枚舉,如下所示:

enum
{
my_enum1 = 0,
my_enum2,
};
或者與 ‘typedef’ 關鍵字聯合使用,如:

typedef enum
{
my_enum1 = 0,
my_enum2,
}my_enum;

2. 傳統enum關鍵字存在的問題
全局作用域
傳統的enum關鍵字的作用域是全局的,也就是說,如果在enum A中聲明的一個枚舉類型my_enum3,無法在enum B中聲明同樣的枚舉類型,具體的就是,如下的寫法是錯誤的,會出現編譯錯誤(會報 重定義錯誤)

enum A
{
my_enum3 = 0,
};

enum B
{
my_enum3 = 0,
};

能隱式轉換為其他類型(如整型)
具體如下面的代碼所示:

enum my_enum
{
my_enum1 = 0,
my_enum2,

};

int my_int = my_enum1;

無法指定底層使用的數據類型
也就是說,無法明確的知道,一個枚舉類型,占用內存的字節數,這樣在結構體中使用enum的時候就可能遇到麻煩, 特別是結構體需要內存對齊或者填充處理的時候問題就尤為突出了。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM