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 };
每个枚举类型均会被分配一个可保存所有枚举常量的整型。这个整型是“基础类型”。每个枚举常量的类型也是整型,并且在 C 语言中可能并不是相同的类型。请务必注意枚举类型的基础类型 与枚举常量类型 之间的区别。
为枚举类型和每个枚举常量选择的大小和符号取决于枚举常量的值以及编译的对象 C 还是 C++ 。C++11 允许为枚举类型指定特定类型;如果提供了此种类型,则会使用该类型,并且此段的其余部分不适用。
在 C++ 模式中,编译器允许枚举常量最高为最大整型(64 位)。C 标准规定所有严格符合 C 代码的枚举常量 (C89/C99/C11) 均必须具有适合“int”类型的值;不过,作为扩展,即使在 C 模式下,也可以使用大于“整数”的枚举常量。
您可以通过使用 --enum_type 命令行选项和/或通过使用属性,来控制挑选枚举类型的策略。如果您使用 --enum_type=packed 选项(默认),则编译器会为枚举类型使用最小类型。如果使用 --enum_type=int 选项,则基础类型将是 int。值超出 int 范围的枚举常量会生成错误。
对于枚举类型,如果 --enum_type=packed,编译器会选择此列表中第一个足够大且符号正确的类型来表示所有枚举常量值:
会跳过“long”类型,因为其与“int”类型大小相同。
例如,下述枚举类型将会以“unsigned char”作为其基础类型:
enum uc { a, b, c };
但下述类型将会以“signed char”作为其基础类型:
enum sc { a, b, c, d = -1 };
而下述类型将会以“signed short”作为其基础类型:
enum ss { a, b, c, d = -1, e = UCHAR_MAX };
对于 C++,枚举常量全都具有与枚举类型相同的类型。
对于 C,则会根据它们的值来为枚举常量分配类型。所有值可以放入“int”的枚举常量都会被指定“int”类型,即使枚举类型的基础类型小于“int”也是如此。所有不能放入“int”的枚举常量都会被指定与枚举类型的基础类型相同的类型。这意味着,一些枚举常量可能与枚举类型具有不同的大小和符号。