代码示例:1.3.8 枚举与 typedef 工程写法
全部示例均标注编译命令、适用环境与实测状态;完整验证记录见《03.5-代码编译运行验证记录》。
examples/ex1-enum-typedef.c · 枚举默认值/手动指定值 + typedef struct/函数指针
/* ex1-enum-typedef.c —— 枚举默认值/手动指定值与 typedef(1.3.8) * 适用环境:Linux / Windows(MinGW) 标准:C11 * 编译:gcc ex1-enum-typedef.c -o ex1 -std=c11 -Wall -Wextra -Wpedantic * 运行:./ex1(Windows: ex1.exe) */ #include <stdio.h> typedef enum { COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_COUNT } color_t; typedef enum { ERR_OK = 0, ERR_BUSY = -1, ERR_TIMEOUT = -2 } err_t; typedef struct { int x; int y; } point_t; typedef int (*binop_t)(int, int); static int add_op(int a, int b) { return a + b; } int main(void) { printf("RED=%d GREEN=%d BLUE=%d COUNT=%d\n", COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_COUNT); printf("OK=%d BUSY=%d TIMEOUT=%d\n", ERR_OK, ERR_BUSY, ERR_TIMEOUT); point_t p = { 3, 4 }; printf("point = (%d, %d)\n", p.x, p.y); binop_t op = add_op; printf("op(2, 3) = %d\n", op(2, 3)); return 0; }examples/ex2-state-machine.c · 枚举状态 + switch 状态机(4 步流转)
/* ex2-state-machine.c —— 枚举状态 + switch 状态机(1.3.8) * 适用环境:Linux / Windows(MinGW) 标准:C11 * 编译:gcc ex2-state-machine.c -o ex2 -std=c11 -Wall -Wextra -Wpedantic * 运行:./ex2(Windows: ex2.exe) * 说明:IDLE→RUNNING→DONE→IDLE 的 4 步流转;真实输出见 examples.yaml */ #include <stdio.h> typedef enum { ST_IDLE, ST_RUNNING, ST_DONE, ST_ERROR } state_t; static const char *state_name(state_t s) { switch (s) { case ST_IDLE: return "IDLE"; case ST_RUNNING:return "RUNNING"; case ST_DONE: return "DONE"; case ST_ERROR: return "ERROR"; } return "UNKNOWN"; } int main(void) { state_t s = ST_IDLE; for (int step = 1; step <= 4; step++) { switch (s) { case ST_IDLE: printf("step %d: %s -> 开始运行\n", step, state_name(s)); s = ST_RUNNING; break; case ST_RUNNING: printf("step %d: %s -> 完成\n", step, state_name(s)); s = ST_DONE; break; case ST_DONE: printf("step %d: %s -> 回到空闲\n", step, state_name(s)); s = ST_IDLE; break; default: printf("step %d: %s\n", step, state_name(s)); s = ST_ERROR; break; } } return 0; }examples/ex3-enum-underlying.txt · 枚举底层类型与"枚举≠强类型"(conceptual:静态讲解)
# 1.3.8 ex3(conceptual 讲解文本,不运行):枚举底层类型与"枚举≠强类型" # # 本文件是"概念讲解型"示例(example_kind=conceptual):只引语言标准,不声称执行。 # # 一、底层类型:不作无条件固定承诺 # C11 6.7.2.2 枚举说明符规定:枚举的底层类型是"能够表示全部枚举成员值的、 # 由实现选择的整数类型"——通常编译器选 int(本机 gcc 15.2.0 实测 sizeof=4), # 但标准不保证一定是 int,也不保证跨编译器/跨 ABI 一致。 # 工程结论: # 1. 不要写死"枚举占 4 字节"——用 sizeof(变量) 实测; # 2. 需要固定宽度的场景(结构体序列化、寄存器对齐、跨 ABI 传输), # 改用 stdint.h 固定宽度类型(uint8_t 等,1.3.11 展开)而不是枚举。 # # 二、枚举不是强类型 # C 的枚举成员是 int 类型的常量;枚举变量可与 int 隐式转换: # enum color { RED, GREEN }; # enum color c = 5; // 合法:int 隐式转枚举(编译器通常只给风格提示,不报错) # int x = RED; // 合法:枚举成员转 int # 对比:C++ 的 enum class 才是强类型(禁止隐式转换)。 # 工程结论:枚举负责"可读性与调试符号",不负责类型安全。 # # 三、与 #define 的对比(面试高频) # #define ST_RUNNING 1 // 预处理纯文本替换:调试器看不到符号、无作用域、易冲突 # typedef enum { ... } state_t; // 调试器可见 ST_RUNNING、有作用域、编译器有类型提示 # # 验证依据(documentation_checked,未运行):C11 标准 6.7.2.2 条文核对; # 本机 sizeof 实测值(4)仅作为"通常为 int"的示例,不作为标准承诺。