我正在创建一组枚举值,但我需要每个枚举值为64位宽。如果我没记错的话,枚举通常与int的大小相同;但是我认为我读过某个地方(至少在GCC中),编译器可以使枚举成为保持其值所需的任何宽度。那么,是否有可能有一个64位宽的枚举?
答案 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)
在C语言中,enum
保证大小为int。有一个编译时选项(-fshort-enums
)使其变短(这在值不超过64K时非常有用)。没有编译时选项可将其大小增加到64位。
答案 4 :(得分:0)
只需将枚举的最后一个值设置为足够大的值,以使其达到您想要的枚举的大小,则该大小应为该大小:
enum value{a=0,b,c,d,e,f,g,h,i,j,l,m,n,last=0xFFFFFFFFFFFFFFFF};
答案 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.因此,无论枚举包含的元素数量如何,其大小始终是固定的。