banner
NEWS LETTER

5-enum

Scroll down

只介绍enum class


问题与需求

enum class的本质作用是 给具有标识意义的int变量加作用域,使bug在编译期能够被发现

具有标识意义,一般指状态码

比如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 不用enum
int OK=0,

ERROR=1,

UNKNOWN=-1;

void status_check(int status) {

if (status == 0) {

printf("OK\n");

} else if (status == 1) {

printf("ERROR\n");

} else if (status == -1) {

printf("UNKNOWN\n");

}

}

这样写可能会导致2个问题:

  1. 0,1,-1这种数字的意义并不明确,可能过几天自己就忘了哪个数对应哪个状态。
  2. 假如代码写错了,把别的int变量错当成 status传到 status_check函数里,编译时不会报错,运行时出问题

所以需要给status做一些设置,使状态码可读性增强,并且把status和普通int变量区分开

这就是enum class要做的事


具体语法

声明语法:

1
enum class 枚举名 [: 底层类型] { 枚举值1 [= 初始值], 枚举值2, ... };

比如:

1
enum class Status : int { OK = 0, Error = 1, Timeout = 2 };
代表可选,这部分加不加都行。底层类型默认int,**初始值默认从0开始递增1**
1
2
3
4

也就是说,下面的写法和上面效果一样:
```C++
enum class Status : { OK, Error, Timeout };

使用场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
enum class Status : { OK, Error, Timeout };

void status_check(Status statuscode) {

switch (statuscode) {
case Status::OK:
printf("OK\n");
break;

case Status::Error:
printf("ERROR\n");
break;

case Status::Timeout:
printf("TIMEOUT\n");
break;

}

}

使用enum之后,Status就像一个类,status_check接受的参数规定为必须是Status类。如果其他变量被错传进来,编译期就会报错。

注意使用枚举值的时候,必须带上枚举名::,就像命名空间一样

其他文章
cover
<% tp.file.title %>
  • 26/05/16
  • 03:26
  • 未分类
目录导航 置顶
  1. 问题与需求
  2. 具体语法