ZHCU876Z July 2001 – October 2023 SM320F28335-EP
在下述声明中,enum e
是一个枚举类型。每一个 a
和 b
均为枚举常量。
enum e { a, b=N };
每个枚举类型均会被分配一个可保存所有枚举常量的整型。这个整型是“基础类型”。每个枚举常量的类型也是整型,并且在 C 语言中可能并不是相同的类型。请务必注意枚举类型的基础类型 与枚举常量类型 之间的区别。
为枚举类型和每个枚举常量选择的大小和符号取决于枚举常量的值以及编译的对象 C 还是 C++ 。C++11 允许为枚举类型指定特定类型;如果提供了此种类型,则会使用该类型,并且此段的其余部分不适用。
在 C++ 模式中,编译器允许枚举常量最高为最大整型(64 位)。C 标准规定所有严格符合 C 代码的枚举常量 (C89/C99/C11) 均必须具有适合“int”类型的值;不过,作为扩展,即使在 C 模式下,也可以使用大于“整数”的枚举常量。
对于枚举类型,编译器选择下述列表中第一个足够大且符号正确的类型来表示所有枚举常量值。 不使用“char”和“short”类型,因为它们与“int”类型大小相同。
例如,下述枚举类型将会以“unsigned int”作为其基础类型:
enum ui { a, b, c };
但下述类型将会以“signed int”作为其基础类型:
enum si { a, b, c, d = -1 };
而下述类型将会以“signed long”作为其基础类型:
enum sl { a, b, c, d = -1, e = UINT_MAX };
对于 C++,枚举常量全都具有与枚举类型相同的类型。
对于 C,则会根据它们的值来为枚举常量分配类型。所有值可以放入“int”的枚举常量都会被指定“int”类型,即使枚举类型的基础类型小于“int”也是如此。所有不能放入“int”的枚举常量都会被指定与枚举类型的基础类型相同的类型。这意味着,一些枚举常量可能与枚举类型具有不同的大小和符号。