1、枚举(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函数 清理了过多的地址空间,从而破坏了外围函数的栈指针的指向,从而必然会导致程 序运行时错误。
2、结构体
3、共用体