作者:可爱的天使keven_464 | 2023-09-01 20:50
我正在创建一组枚举值,但我需要每个枚举值为64位宽.如果我没记错的话,枚举通常与int的大小相同; 但是我认为我读过某个地方(至少在GCC中),编译器可以使枚举成为保持其值所需的任何宽度.那么,有可能有一个64位宽的枚举?
1> Robert Gambl..:
一个enum
只保证大到足以容纳int
值.编译器可以根据定义的枚举常量自由选择使用的实际类型,因此如果它可以表示您定义的值,它可以选择较小的类型.如果您需要不适合的枚举常量,int
则需要使用特定于编译器的扩展来执行此操作.
你的第一句似乎与你的上一句有冲突.是'enum`应该大于`int`还是更小的约束?在@MichaelStum的回答之后,你的第一句应该是"An`enum`只能保证符合'int`值."
这个答案似乎表明枚举和`int`一样大.[Michael Stum的答案](/sf/ask/17360801/),引用C99,说enum可能和`char`一样小.
这个答案的第一句话是不正确的."enum"仅保证足够大以容纳枚举中最大枚举器的值.
2> Michael Stum..:
取自目前的C标准(C99):http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.7.2.2枚举说明符
[...]
约束条件
定义枚举常量值的表达式应为整数常量表达式,其值可表示为int.
[...]
每个枚举类型应与char,有符号整数类型或无符号整数类型兼容.类型的选择是实现定义的,但应能够表示枚举的所有成员的值.
并不是说编译器擅长遵循标准,但实质上是:如果你的枚举除了int之外还有其他东西,那么你就会陷入深深的"不支持的行为,可能会在一两年之后再次咬你".
在实际的PDF中,它定义:"枚举器列表中的标识符被声明为具有int [...]类型的常量".我省略了它,使它不是太冗长.
只有那个,我认为以下是有效的:枚举{LAST = INT_MAX,LAST1,LAST2}; 所以LAST2在int中不可表示,但没有定义它的表达式.
注意"*a*有符号整数类型,或***无符号整数类型".不一定是`int`.`short`和`long`也是整数类型,无论实现选择什么,所有值都必须适合("*将*能够表示枚举的所有成员的值").
值得注意的是:_enumeration constant_和_enumerated type_ **不是同一件事**。前者是枚举声明列表的内容,后者是实际变量。因此,尽管枚举常量必须为“ int”,但实际的枚举变量可能是另一种类型。这是标准中众所周知的不一致之处。
3> Kevin Cox..:
虽然之前的答案是正确的,但是一些编译器可以选择破坏标准并使用包含所有值的最小类型.
GCC示例(GCC手册中的 doucmentation ):
enum ord {
FIRST = 1,
SECOND,
THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )
实际上,据我所知,这并没有打破标准.正如Michael Stum的回答所解释的那样,只要所有值都适合,标准允许编译器选择枚举的实际类型.
我使用过MacOS C++编译器,它们利用枚举中有限的值范围将它们存储在较小的类型中.不记得是Metrowerks Codewarrior还是XCode.这符合C++标准.一般来说,你不能假设sizeof(MyEnum)== sizeof(int).