C陷阱篇之enum默認長度


轉載僅用於學習: https://blog.csdn.net/ipmux/article/details/17334099

  enum型用於定義常量集合,相比#define有一些優勢,如:enum是一種數據類型,使用時會檢查類型匹配;enum增加了范圍約束,避免變量賦值和使用時超出定義范圍。但enum也有一個隱含問題:enum變量占用的空間與編譯器相關。

    多數編譯器默認enum型長度等於int型,很多人也把enum型變量等同於int,但C標准在這里留下了尾巴:“枚舉型尺寸是能夠容納最大枚舉子值的整數尺寸”,“枚舉類型中枚舉子的值必須要能用一個int型表述”。也就是說,枚舉型的尺寸不能超過int型,但不必等於int型,只要能容納最大枚舉子就行,下例:

    enum EType1 { e1 = CHAR_MAX };

    enum EType2 { e2 = SHORT_MAX };

    這兩個枚舉類型最小可用char、short的內存空間表示,即有可能:

    sizeof( EType1 ) == sizeof( char );

    sizeof( EType2 ) == sizeof( short );

    一些編譯器為節約內存可以設置這種“量體裁衣”的策略。如ADS就有圖示選項(enum container always int),選定后enum變量長度為int,否則就等於能容納最大枚舉子的最短長度。gcc也有類似選項-fshort-enums,默認不設定,一旦設置就選用節省內存的enum長度。

  

     enum長度不確定會帶來可移植性問題,如果第三方庫API接口使用enum類型,編譯和調用庫時一旦有關enum長度的編譯器設置不一致,API接口層對數值的解析就不匹配。比如上層應用編譯時沒有用-fshort-enums,默認用4字節空間來存儲使用enum變量,而編譯庫時設置了fshort-enums,則庫內部此enum size可能為1。當把enum變量地址傳進API時,內部只修改變量最低字節,高3字節值無變化(內容隨機),API返回時,上層使用的4字節enum變量值就可能隨機。(潛規則篇之API接口)

    因此內部代碼使用enum類型優於define,但對外API接口盡量避免用enum型。
————————————————
版權聲明:本文為CSDN博主「ipmux」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ipmux/article/details/17334099


免責聲明!

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



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