枚举(enum)所占空间

来源:互联网 发布:php ci框架 编辑:程序博客网 时间:2024/05/29 18:46

枚举(enum)

枚举的定义:

enum LOG_LEVEL{    DBG,    INF,    WAR,    ERR,    FAT,    ALL,    OFF};void WriteInfor(LOG_LEVEL level){  switch(level){case DBG:printf("%d\n",DBG);......}}

上述定义的枚举类型,默认为DBG=0,INF=1,依次类推。

(1)枚举类型是实数类型,可以跟int类型相互转换。 其所定义的常量子与枚举类型有同样的可见性,即DBG等可以被枚举类型外面的代码所看到。枚举类型没有名字限定作用。struct有名字限定作用。

(2)枚举类型所占的空间

C++标准文档中是这样说明的:“枚举类型的尺寸是以能够容纳最大枚举子的值的整数的尺寸”,同时标准中也说名了:“枚举类型中的枚举子的值必须要能够用一个int类型表述”,也就是说,枚举类型的尺寸不能够超过int类型的尺寸,但是是不是必须和int类型具有相同的尺寸呢?上面的标准已经说得很清楚了,只要能够容纳最大的枚举子的值的整数就可以了在VS2010中sizeof的值为4。

(3)枚举和int是否可以互换

枚举长度可能比int小,有些情况下最好不用互换。

enum EType { e1 = 0, e2, e3 };EType val;std::scanf( "%d", &val );

枚举类型变量的尺寸不一定和int类型相同,这样一来我们采用%d就 是说将枚举类型变量val当作4字节的int变量来看待并进行参数压栈,而在某些编 译器下sizeof( val )等于1字节,这样scanf函数就会将val变量地址中的后续的三 字节地址也压入栈中,并对其进行赋值,也许val变量后续的三个字节的地址没有 特殊含义可以被改写(比如是字节对齐的空地址空间),可能会认为他不会出现错 误,其实不然,在scanf函数调用结束后会进行栈清理,这样一来会导致scanf函数 清理了过多的地址空间,从而破坏了外围函数的栈指针的指向,从而必然会导致程 序运行时错误。

0 0
原创粉丝点击