C中枚举的大小是多少?

时间:2008-12-14 01:07:03

标签: c enums

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

7 个答案:

答案 0 :(得分:89)

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

答案 1 :(得分:88)

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

  

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

编译器并不擅长遵循标准,但实质上是:如果你的枚举除了int之外还有其他东西,那么你就会陷入深深的“不受支持的行为,可能会在一两年内叮咬你”。

答案 2 :(得分:14)

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

GCC的例子(the GCC Manual中的doucmentation):

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

答案 3 :(得分:0)

只需将枚举的最后一个值设置为足够大的值,以使其达到您想要的枚举的大小,则该大小应为该大小:

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

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-5)

考虑:

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

这将输出为4.因此,无论枚举包含的元素数量如何,其大小始终是固定的。