枚举类型 | enum
枚举器 enumerator:就是枚举定义中的符号常量/命名常量/枚举常量
enum
enum是一个自定义数据类型,用以保存整型常量,并且可以通过名字引用这些常量
默认情况下,enum中定义的值的类型是signed int,这意味着枚举量可以是负数
枚举类型主要提供了两个语义:
- 提供了整型符号常量(判断时可读性更好)
- 提供了一个枚举类型(可以定义枚举变量)
定义枚举
使用enum关键字即可定义枚举
枚举可以是
- 匿名的
- 具名的
enum{ // 该枚举类型没有名字,为匿名枚举
Up,
Down,
Left,
Right
};
enum Direction{ // 具名枚举
Up,
...
};
枚举定义中的标识符,可以作为整型符号常量进行使用(一般配合switch语句使用)
不论是枚举类型名,还是定义中的符号常量;都不允许在当前作用域中存在标识符冲突
例如下一小节中,同时定义两个枚举,会出现标识符冲突
枚举变量
定义枚举变量的方式有两种
- 定义枚举时声明
- 定义之后声明
匿名枚举只能通过第一种方式声明变量
enum{
Red,
Blue,
Green
}color1; // 在枚举定义结尾声明
enum Color{
Red,
Blue,
Green
};
enum Color color2; // 使用枚举类型声明
C语言中声明枚举变量,也需要加enum关键字
尽管枚举变量被认为是枚举类型,但是它们仍然存在以下特性
- 可以给它们赋整型值(包括其他枚举中的值(符号常量)
- 可以赋给整型值的变量,也可以把枚举变量赋给它们
就是说尽管是枚举类型,在赋值时,C语言并不区分枚举类型与整型
下面的语句都是合法的
// @file main.c
enum {Bicycle, Motorbike, Car};
color1 = Car;
color1 = 200;
int a = 10;
color1 = a;
a = color1;
在C语言中是合法的,但C++无法完成转换
C++中的枚举
为了解决枚举中符号常量可能存在的命名冲突问题
C++引入了命名空间,部分解决了这个问题
C++11还引入了强类型(或范围)枚举enum class
// 无范围枚举
enum [identifier] [:type] {enum-list};
// 范围枚举
enum [class|struct] [identifier] [:type] {enum-list};
可以看到C++中支持指定枚举的类型[:type],可以是任何整型
class关键字,用以表示该枚举区分范围,并且必须提供枚举类型名(identifier)
符号常量范围
在原始的C/C++enum类型中,符号常量在声明enum的整个范围中可用
在区分范围的枚举中,符号常量必须由enum的类型名进行限定
也就是说,需要在枚举类型上使用作用域运算符,才可访问
enum class Test{
a,
b
};
Test::a
可以看到,如果不使用作用域运算符,符号常量Red会被识别为未定义标识符
color1 = Color::Red; // 合法

要将int转换为枚举类型时,需要强制转换
static_cast<int>(enumerator);
下面是一些类型转换的例子
无范围枚举:
color1 = static_cast<Color>(a); // 合法


参考文档
GNU C Reference Manual
Microsoft Learn
cppreference.com

浙公网安备 33010602011771号