跳到主要内容
🔍

代码示例: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"的示例,不作为标准承诺。