12个月份名、一周7天名、模式名、状态名,等同类名合集,在程序中会用到。使用宏定义实现,宏名过多,代码松散;使用数组实现,亦是如此,enum能减少内存占用、使得代码紧凑、清晰简洁!
或者
enum color {red=1 , green =5, blue=10} paint;枚举值在未特定赋值外,后续枚举成员默认都是依上个成员的枚举值依次递增的。
C/C++中枚举变量的大小是 1<=sizeof(enum)<=sizeof(int) 字节 (1-4字节),编译器通过编译器选项,有的处理成32bit,有的处理成8bit。
该博主测过数据、论枚举类型的存储空间 在Visual C++ 6.0编译器默认为枚举变量分配4字节的存储空间 在MDK–ARM环境下测试的结果是只为枚举变量分配1字节的存储空间
可以通过继承方式改变枚举的大小,例如:
enum EnumChar : unsigned char { A = 0x00, B, C = 0xff };TypeChar 类型变量大小占用1字节
枚举常量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。
枚举列表中的标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。
c++11可以指定编译器使用哪种整型来存储定义的枚举类型。如 enum class test : unsigned int {TEST1,TEST2}; 如果不指定存储类型,则限定作用域的枚举类型使用int来作为存储类型,如果枚举成员的取值超过其表达范围会编译错误。 如果不指定存储类型,则不限定作用域的枚举类型使用什么类型由编译器负责,编译器只要保证存储类型够大可以存储所有成员即可,不同的编译器可能会使用不同的存储类型。
在c++11标准中,除了传统的enum关键字之外, 还新增了一个概念: enum class, enum struct组合的形式(两者是等价的),当然单纯的enum关键字和enum class组合并不冲突,都能使用。 这一组合的出现就是为了解决传统enum关键字面临的问题。
enum class组合具有class封装性的特性,作用域是确定的 enum class A { my_enum3 = 0, }; enum class B { my_enum3 = 0, }; enum C { my_enum3 = 0, }; 如上面这样声明和定义枚举就是正确的,要访问A和B中的枚举是需要加上作用域的,形如: A a = A::my_enum3; B b = B::my_enum3; 可以指定底层数据类型 enum class A: int /** 每个枚举都是int类型的 */ { my_enum3 = 0, }; enum class B: unsigned char /** 每个枚举都是unsigned char类型的 */ { my_enum3 = 0, }; 不能隐式转换 int my_int = A::my_enum3; /** 错误,无法通过编译 */ int my_int = static_cast<int>(A::my_enum3); /** 正确, 可以通过编译 */1、枚举类型 2、C/C++中枚举类型enum使用 3、C语言枚举类型(C语言enum用法)详解–编程 4、enum 变量内存大小(c++) 5、unsigned char to enum 6、论枚举类型的存储空间 7、c++11 强类型枚举 enum class 8、奇妙的enum class,enum struct组合