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;
}
相关推荐
Sakura_j_h_1 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
冷凝雨1 小时前
前导零、后导零、最高有效位、最低有效位计算(C)
c语言
鸥梨菌Honevid2 小时前
C 语言 restrict 关键字深度解析:从“独占访问”承诺到编译器激进优化
c语言
小成202303202656 小时前
C++~07补充
开发语言·c++
水饺编程6 小时前
第2章:Linux 基础,切换用户
linux·c语言·汇编
知识分享小能手8 小时前
C学习教程,从入门到精通,C语言学生信息管理系统 — 知识点详解(18)
c语言·学习·1024程序员节
爱读书的小胖8 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
pipixia200338 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间