当前位置:  开发笔记 > IOS > 正文

C中枚举的大小是多少?

如何解决《C中枚举的大小是多少?》经验,为你挑选了3个好方法。

我正在创建一组枚举值,但我需要每个枚举值为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).
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有