读书人

关于枚举大小,该如何处理

发布时间: 2012-02-27 10:00:22 作者: rapoo

关于枚举大小
原来帖子不知道为什么无法回复,只好再开了,不好意思。

问题:编译器是不是控制着枚举类型的大小,怎么控制的?

书里对枚举大小的定义是:sizeof枚举是sizeof某类可以包含枚举range的整型,并且不会大于sizeof(int)。也就是说枚举大小不一定等于sizeof(int)。

比如在一个sizeof(int)等于4的机器上,sizeof枚举有可能是1或者4,但不会是8

我问这个问题的原因是发现一些代码里会在枚举定义的最后会出现一个这个东西:
FORCE_DWORD = 0x7fffffff
比如:
typedef enum _D3DPOOL {
D3DPOOL_DEFAULT = 0,
D3DPOOL_MANAGED = 1,
D3DPOOL_SYSTEMMEM = 2,
D3DPOOL_SCRATCH = 3,

D3DPOOL_FORCE_DWORD = 0x7fffffff
} D3DPOOL;

根据书里描述,这个成员的作用就是控制枚举类型的range,从而强制让sizeof枚举为sizeof(DWORD)。而这么做的目的就是为了高效地32位寻址。

看到这个我就在VS2005里试验了一下,发现不必加入那个控制range的成员,所有枚举大小都等于int。所以觉得是某个编译器参数在控制。所以来这里问一下这个参数是啥。


[解决办法]
应该与编译器有关,不同的编译器有不同的实现。这种东西知道就好,没必要深究。
[解决办法]
这个是环境相关的咚咚 ~
[解决办法]
enum X {TEST = 0xfffffffffLL }; 在devcpp下,X就是8字节的。
[解决办法]
一般编译器都有选项的
BCB:
* -b Make enums integer-sized (-b- makes them short as possible)
GCC:
-fshort-enums Use the narrowest integer type possible for enumeration types
VC Same as int

读书人网 >C++

热点推荐