C 枚举变量

核心场景:线程状态控制

用来管理一组关联的状态:就绪 READY、运行 RUNNING、暂停 SUSPEND、恢复 RESUME、退出 EXIT

传统方案缺点

  1. 全局变量:需要人工维护数字和状态的对应关系,容易写错
  2. #define宏:新增状态时,后面所有常量数值要手动改,牵一发而动全身,维护麻烦

枚举语法与数值规则

c 复制代码
enum ThreadState
{
    THREAD_READY,        //0
    THREAD_RUNNING,      //1
    THREAD_SUSPEND = 10, //手动指定值10
    THREAD_RESUME,       //自动=11
    THREAD_EXIT          //自动=12
    };
  1. 默认规则:默认从 0 开始,依次 + 1 递增
  2. 手动赋值:给某个枚举成员指定数字,后面成员自动在该值基础上 + 1
  3. 编译期常量:枚举值编译阶段就确定,不占用运行时内存

核心特性

  1. 类型安全 枚举变量只能接收枚举内定义的值;不能随便赋值无关整数,减少魔数 bug
  2. 分组管理 可以手动设置起始值,把不同分组的状态划分区间,方便管理
  3. 可直接运算输出 本质底层是整型,可以用printf("%d", THREAD_EXIT)打印数值,支持比较判断

优势对比

● 对比全局变量:可读性高,有类型校验,不容易传错数值

● 对比#define宏:维护简单,中间插入新状态,不会改动原有枚举常量的值

适用场景

  1. 状态机、设备 / 线程状态管理
  2. 选项、命令、类型标记
  3. 替代代码里的魔数 (magic number),提高代码可读性

易混淆点

  1. 枚举成员是常量,不能修改
  2. C 语言枚举本质是 int,只是编译器增加类型检查;C++ 类型检查更严格
  3. 枚举常量在预处理阶段不会像宏那样做文本替换

完整示例代码

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;
}
相关推荐
大可不必了4 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus4 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道5 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛5 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
eggwyw7 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
another heaven11 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude11 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
SomeOtherTime13 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain13 小时前
C++转Java日记(10)
java·开发语言
总要学点什么14 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium