在 C 中枚举的大小是多少?

我正在创建一组枚举值,但是我需要每个枚举值的宽度为64位。如果我没记错的话,枚举的大小通常与 int 相同; 但是我记得在某处读到过(至少在 GCC 中)编译器可以使枚举的宽度达到保存它们的值所需的任何宽度。那么,有没有可能有一个64位宽的枚举呢?

242749 次浏览

enum只能保证足够大以容纳 int值。编译器可以根据定义的枚举常数自由选择实际使用的类型,因此如果它可以表示您定义的值,则可以选择较小的类型。如果您需要不适合于 int的枚举常量,则需要使用特定于编译器的扩展来实现。

取自当前的 C 标准(C99) : http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2枚举说明符
[...]
约束
定义枚举常数值的表达式应为整数 具有可表示为 int 的值的常量表达式。
[...]
每个枚举类型应与 char、有符号整数类型或 无符号整数类型。类型的选择是实现定义的,但应为 能够表示枚举的所有成员的值。

这并不是说编译器擅长遵循标准,而是本质上: 如果您的枚举包含任何不包含 int 的内容,那么您就陷入了深深的“不受支持的行为”,这种行为可能会在一两年内反噬您”。

更新: 最新公开发布的 C 标准草案(C11) : http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf包含相同的条款。因此,这个答案仍然适用于 C11。

虽然前面的答案是正确的,但是有些编译器可以选择打破标准,使用包含所有值的最小类型。

例如 海湾合作委员会(海湾合作委员会手册中的文档) :

enum ord {
FIRST = 1,
SECOND,
THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )

考虑下面的代码:

enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;

它将给出4作为输出。因此,无论 enum包含多少个元素,它的大小总是固定的。

我们无法控制 enum变量的大小。它完全取决于实现,编译器提供了使用 enum存储整数名称的选项,因此 enum的大小跟随整数。

在 C 语言中,enum的大小保证为 int。有一个编译时间选项(-fshort-enums)可以使它变短(这在值不超过64K 的情况下非常有用)。没有编译时选项可以将其大小增加到64位。

只需将枚举的最后一个值设置为一个足够大的值,使其大小符合您希望枚举的大小,然后它就应该是这个大小:

enum value{a=0,b,c,d,e,f,g,h,i,j,l,m,n,last=0xFFFFFFFFFFFFFFFF};