核心场景:线程状态控制
用来管理一组关联的状态:就绪 READY、运行 RUNNING、暂停 SUSPEND、恢复 RESUME、退出 EXIT
传统方案缺点
- 全局变量:需要人工维护数字和状态的对应关系,容易写错
- #define宏:新增状态时,后面所有常量数值要手动改,牵一发而动全身,维护麻烦
枚举语法与数值规则
c
enum ThreadState
{
THREAD_READY, //0
THREAD_RUNNING, //1
THREAD_SUSPEND = 10, //手动指定值10
THREAD_RESUME, //自动=11
THREAD_EXIT //自动=12
};
- 默认规则:默认从 0 开始,依次 + 1 递增
- 手动赋值:给某个枚举成员指定数字,后面成员自动在该值基础上 + 1
- 编译期常量:枚举值编译阶段就确定,不占用运行时内存
核心特性
- 类型安全 枚举变量只能接收枚举内定义的值;不能随便赋值无关整数,减少魔数 bug
- 分组管理 可以手动设置起始值,把不同分组的状态划分区间,方便管理
- 可直接运算输出 本质底层是整型,可以用printf("%d", THREAD_EXIT)打印数值,支持比较判断
优势对比
● 对比全局变量:可读性高,有类型校验,不容易传错数值
● 对比#define宏:维护简单,中间插入新状态,不会改动原有枚举常量的值
适用场景
- 状态机、设备 / 线程状态管理
- 选项、命令、类型标记
- 替代代码里的魔数 (magic number),提高代码可读性
易混淆点
- 枚举成员是常量,不能修改
- C 语言枚举本质是 int,只是编译器增加类型检查;C++ 类型检查更严格
- 枚举常量在预处理阶段不会像宏那样做文本替换
完整示例代码
c
#include <stdio.h>
//线程状态枚举
enum ThreadState
{
THREAD_READY,
THREAD_RUNNING,
THREAD_SUSPEND = 10,
THREAD_RESUME,
THREAD_EXIT
};
int main(void)
{
enum ThreadState state = THREAD_SUSPEND;
printf("%d\n", state); //10
printf("%d\n", THREAD_RESUME);//11
return 0;
}