ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
在下述聲明中,enum e 是一個枚舉類型。每一個 a 和 b 均為枚舉常量。
enum e { a, b=N };
每個枚舉類型均會被分配一個可保存所有枚舉常量的整型。這個整型是“基礎(chǔ)類型”。每個枚舉常量的類型也是整型,并且在 C 語言中可能并不是相同的類型。請務(wù)必注意枚舉類型的基礎(chǔ)類型 與枚舉常量類型 之間的區(qū)別。
為枚舉類型和每個枚舉常量選擇的大小和符號取決于枚舉常量的值以及編譯的對象 C 還是 C++ 。C++11 允許為枚舉類型指定特定類型;如果提供了此種類型,則會使用該類型,并且此段的其余部分不適用。
在 C++ 模式中,編譯器允許枚舉常量最高為最大整型(64 位)。C 標(biāo)準(zhǔn)規(guī)定所有嚴(yán)格符合 C 代碼的枚舉常量 (C89/C99/C11) 均必須具有適合“int”類型的值;不過,作為擴(kuò)展,即使在 C 模式下,也可以使用大于“整數(shù)”的枚舉常量。
您可以通過使用 --enum_type 命令行選項(xiàng)和/或通過使用屬性,來控制挑選枚舉類型的策略。如果您使用 --enum_type=packed 選項(xiàng)(默認(rèn)),則編譯器會為枚舉類型使用最小類型。如果使用 --enum_type=int 選項(xiàng),則基礎(chǔ)類型將是 int。值超出 int 范圍的枚舉常量會生成錯誤。
對于枚舉類型,如果 --enum_type=packed,編譯器會選擇此列表中第一個足夠大且符號正確的類型來表示所有枚舉常量值:
會跳過“l(fā)ong”類型,因?yàn)槠渑c“int”類型大小相同。
例如,下述枚舉類型將會以“unsigned char”作為其基礎(chǔ)類型:
enum uc { a, b, c };
但下述類型將會以“signed char”作為其基礎(chǔ)類型:
enum sc { a, b, c, d = -1 };
而下述類型將會以“signed short”作為其基礎(chǔ)類型:
enum ss { a, b, c, d = -1, e = UCHAR_MAX };
對于 C++,枚舉常量全都具有與枚舉類型相同的類型。
對于 C,則會根據(jù)它們的值來為枚舉常量分配類型。所有值可以放入“int”的枚舉常量都會被指定“int”類型,即使枚舉類型的基礎(chǔ)類型小于“int”也是如此。所有不能放入“int”的枚舉常量都會被指定與枚舉類型的基礎(chǔ)類型相同的類型。這意味著,一些枚舉常量可能與枚舉類型具有不同的大小和符號。