我正在创建一组枚举值,但是我需要每个枚举值都是64位宽。如果我没记错的话,枚举的大小通常与int相同;但是我想我读过某个地方(至少在GCC中),编译器可以使枚举具有保持其值所需的任何宽度。那么,是否可能有一个64位宽的枚举?
我正在创建一组枚举值,但是我需要每个枚举值都是64位宽。如果我没记错的话,枚举的大小通常与int相同;但是我想我读过某个地方(至少在GCC中),编译器可以使枚举具有保持其值所需的任何宽度。那么,是否可能有一个64位宽的枚举?
Answers:
enum
仅保证An 足够大以容纳int
值。编译器可以根据定义的枚举常量自由选择使用的实际类型,因此,如果编译器可以表示您定义的值,则可以选择较小的类型。如果您需要不适合的枚举常量,int
则需要使用特定于编译器的扩展名。
enum
应该大于int
还是小于an的约束?在@MichaelStum回答之后,您的第一句话应该是“ enum
仅保证将An 放入int
值中”。
enum
只保证大足以容纳中枚举最大的枚举值。
取自当前的C标准(C99):http : //www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.7.2.2枚举符
[...]
约束
定义枚举常数的值应是具有值的可表示为int的整数常量表达式的表达式。
[...]
每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,但应能够代表枚举的所有成员的值。
并不是说编译器擅长遵循该标准,而是本质上:如果您的枚举不包含int,则您处于深层的“不受支持的行为,可能会在一两年之内让您陷入困境”。
int
,但实际的枚举变量可以是另一种类型。这是标准中众所周知的不一致之处。
enum my_enum { my_value }
,my_value
将具有type int
,但是enum my_enum
可以具有实现定义的类型,该类型必须至少表示所有枚举值。因此,my_value
可能会缩小到的转换范围enum my_enum
,但可以保证不会溢出。
尽管前面的答案是正确的,但某些编译器可以选择打破标准并使用包含所有值的最小类型。
GCC的示例(《 GCC手册》中的文档):
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
包含的元素数量如何,其大小始终是固定的。