C++中的枚举类型及其与宏的关系
在编程时,如果想让一个变量只在规定范围内取值,就会用到enum类型,尤其是在跟switch语句配合使用时。
从size说起
enum类型的概念不难理解,但值得注意的是:enum类型的大小如何,或者说占几个Bytes?
在C语言中,一个enum类型的大小由编译器自行确定。确定规则是,确保enum取值范围中任一元素对应的整型值都能被表达。1
2
3
4
5
6
7
8
9
10enum color1{
YELLOW = 0x1,
BLACK = 0x2
};
enum color2{
YELLOW = 0x1122334455,
BLACK = 0x2
};
// sizeof(color1) = 4;
// sizeof(color2) = 8;
产生编译器依赖显然不是件好事,所以C++中增加了显式指定enum类型大小的语法:1
2
3
4enum color1 : int{
YELLOW,
BLACK
};
enum hack
C++有了上述写法之后,又产生了这么一种off label的用法:1
2
3
4enum : int{
YELLOW = 1,
BLACK = 2
};
这个写法其实是为了定义常数变量,直观理解上可以直接认为是宏定义即可。
深究的话,需要知道常用的定义常数变量的方式有三种:
- const关键字,缺点是有可能要为该常量进行内存分配。因为其既然是一个显式定义的变量,那么就应当允许对其取址,这就意味着要占用内存。
- 宏定义,内在逻辑是替换,所以没有了占内存的缺点,但是有同类信息没能聚合到一起的缺点。
- anonymous enum,似乎是种完美的做法。一来,对于C++这种强类型的的语言,宏定义的方式绕过了类型检查,没能物尽其用的感觉。二来,enum定义同时完成了同类信息的聚合。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!