C 语言 enum 的用法 一、enum 是什么enum是枚举类型用来定义一组有限、固定、具名字的整型常量。本质枚举成员都是int常量只是用文字替代数字可读性远优于纯数字。语法基础enum 枚举名 { 枚举常量1, 枚举常量2, 枚举常量3 };二、基础默认规则不手动赋值若不给成员指定数值默认从0开始依次自增 1#include stdio.h enum Color { RED, // 0 GREEN, // 1 BLUE // 2 }; int main(void) { enum Color c GREEN; printf(RED%d, GREEN%d, BLUE%d\n, RED, GREEN, BLUE); printf(c %d\n, c); return 0; }输出RED0, GREEN1, BLUE2 c 1三、手动指定枚举常量的值1. 指定第一个值后续自动递增enum Week { MON 1, TUE, // 2 WED, // 3 THU, // 4 FRI, // 5 SAT, // 6 SUN // 7 };2. 任意成员自定义数值后面继续自增enum Status { OK 0, WARN 10, ERR, // 11 FATAL 99 };3. 允许多个枚举成员取相同数值enum Signal { OFF 0, LOW 0, HIGH 1 };四、enum typedef 简化工程最常用原生枚举变量必须写enum Color搭配typedef可省略enum1. 分开定义enum Color { RED, GREEN, BLUE }; typedef enum Color Color; Color c RED;2. 一步简写推荐typedef enum { RED, GREEN, BLUE } Color; Color c BLUE;五、枚举变量使用规则1. 赋值方式typedef enum { ON, OFF } Switch; int main() { Switch s1 ON; // 标准赋值 Switch s2 0; // 合法枚举本质int int x OFF; // 枚举常量可直接赋值给int return 0; }2. 与整型混用、比较typedef enum { A1, B2, C3 } Test; if (B 2) { printf(相等\n); }3. 数组下标、switch 完美适配枚举最适合switch代码更清晰明了#include stdio.h typedef enum { CMD_START, CMD_STOP, CMD_RESET } Cmd; void handleCmd(Cmd cmd) { switch(cmd) { case CMD_START: printf(启动设备\n); break; case CMD_STOP: printf(停止设备\n); break; case CMD_RESET: printf(复位设备\n); break; default: printf(未知指令\n); } } int main() { handleCmd(CMD_RESET); handleCmd(99); // 传入非法int也能进default return 0; }六、枚举的作用域全局枚举定义在函数外整个文件可用局部枚举定义在函数内部仅函数内有效。void func() { enum Local { X1, Y2 }; enum Local a X; } // 外部无法使用 enum Local七、枚举常量是常量不可修改枚举成员是编译期常量不能被赋值typedef enum { A, B } E; A 100; // 编译报错常量不能左值赋值八、enum vs #define核心区别很多人用宏定义常量枚举优势明显对比项enum#define类型检查有属于独立枚举类型编译器可校验无纯文本替换只是数字作用域遵循局部 / 全局作用域全局生效无局部作用域调试调试器能看到常量名RED/GREEN调试只显示数字看不到名字占用空间一组常量只分配一份类型信息每个宏单独文本替换无分组switch 支持天然适配可读性强也能用但语义松散示例对比// 宏方式 #define RED 0 #define GREEN 1 #define BLUE 2 // 枚举方式更优 typedef enum { RED, GREEN, BLUE } Color;九、复杂实战位掩码枚举硬件 / 标志位高频用法利用 2 的幂赋值一个 int 存储多个标志位typedef enum { FLAG_READ 1 0, // 0b0001 FLAG_WRITE 1 1, // 0b0010 FLAG_EXEC 1 2 // 0b0100 } FileFlag; int main() { // 同时开启读写权限 int flags FLAG_READ | FLAG_WRITE; // 判断是否有写权限 if (flags FLAG_WRITE) { printf(可写入\n); } // 移除读权限 flags ~FLAG_READ; return 0; }