1.枚举变量及其用法
枚举,是C语言的一种基本类型。在C语言中,枚举列举了一组基本的变量,并穷举了所有变量。枚举变量一般用于状态或者事件的穷举。一种常用的方法是:枚举变量标注状态机的状态变化。(见我本人的博客:https://blog.csdn.net/wangzhezhilu001/article/details/107342443)
同时,枚举变量还用于标注有限的变量,防止变量出错。
2.C++ 98之前的枚举变量
在C系列语言中,枚举变量虽然存在,但长期以来,并没有对枚举变量的错误进行限制。在如下用法中,枚举变量是长期支持的。
enum Color
{
Red = 0,
Yello,
Blue,
};
Color c = false; // C++ 98之前的C++编译器和传统的C编译器支持
这是因为,在传统的C系列编译器中,并没有对枚举变量进行强制规定;所以,如果数据符合相应枚举,自然会被枚举变量接纳。而且,在C语言中枚举是 常量数值的 别名,因此会被隐式转换为整形。
而且,在传统的C编译器和C++98编译器,枚举变量并没有被限制在作用域,这让隐式转换普遍存在。
这一系列问题,可能会造成如下问题,即枚举值接受一个奇怪的值,造成奇怪的错误。
3.C++11对枚举变量的改进
C++11为避免该错误,对枚举类型进行了更多限制。
首先,枚举变量被进行了作用域限制。也就是说,在C++11中,枚举变量只能限制在枚举命名的作用域之内。也就是说,上面的做法,在C++11中不进行支持。
其次,C++11增加了枚举类。在C++11中,枚举类的关键字class并不代表有任何差别。枚举类中,不能声明函数。但在C++11中,枚举类意味着:C++11把枚举作为单独的整体来进行定义。
值得注意的是,在C++11中,枚举类的默认类型依然是整型,而不同意JAVA中默认枚举类的类型为一个class。
提供样例代码如下:
#include <iostream>
using namespace std;
enum Day
{
Sunday = 0,
Monday,
Tuesday,
Thursday,
Friday,
Saturday,
InvalidDay = 999,
};
enum class State: int16_t
{
Init = 0,
Start,
Running,
Pause,
Stop,
Exit,
Invalid = 999,
};
std::ostream &operator << (std::ostream &os, State state)
{
switch (state)
{
case State::Init:
{
os << "Init";
break;
}
case State::Start:
{
os << "Start";
break;
}
case State::Running:
{
os << "Running";
break;
}
case State::Pause:
{
os << "Pause";
break;
}
case State::Stop:
{
os << "Stop";
break;
}
case State::Exit:
{
os << "Init";
break;
}
default:
{
os << "Invalid";
break;
}
}
}
int main()
{
// Day d = 1; //C++11中不再支持
Day d = Day::Friday;
cout << d << endl;
State s;
s = State::Running;
cout << s << endl;
return 0;
}
该代码已上传到本人个人github:https://github.com/diziqian/enumTest