枚举(enum)用于为一组相关的整数常量赋予可读的名字,常用于状态码、错误码、菜单选项等场景,可避免在代码中散落未经说明的魔法数字。

基本枚举类型

若用裸整数表示运算种类,含义往往不直观:

int op = 2;   /* 2 表示何种运算,需查文档或注释 */

可用枚举为常量命名:

enum calculate { SUM, DIFFERENCE, PRODUCT, QUOTIENT };

未显式赋值的枚举常量从 0 起依次递增:SUM 为 0,DIFFERENCE 为 1,PRODUCT 为 2,QUOTIENT 为 3。使用示例:

C 语言枚举示例运行
#include <stdio.h>

enum direction { EAST, NORTH, WEST, SOUTH };

int main(void) {
    enum direction dir = NORTH;   /* 值为 1 */
    printf("%d\n", dir);

    dir = 3;   /* 可赋与底层整型兼容的整数值 */
    printf("%d\n", dir);
    return 0;
}

枚举常量名宜采用全大写等醒目风格,且在同一作用域内须唯一;若两个枚举均定义同名常量,将导致编译错误。

手动指定枚举值

可为部分成员指定整数值,未指定的成员取前一成员值加 1:

enum enm { a = 3, b = 2, c };   /* c 为 3(在 b 的基础上 +1) */

enum enm v1 = a, v2 = b, v3 = c;
printf("%d %d %d\n", v1, v2, v3);   /* 3 2 3 */

各常量须为整数类型;若业务上仍使用裸整数而不用枚举名,则可读性优势会减弱。

大小与存储

枚举类型定义本身不单独占用存储;枚举变量会占用内存。实现上多按 int 处理,可用 sizeof 验证:

printf("%zu bytes\n", sizeof(dir));   /* 常见为 4 字节 */

个别实现可能选用更窄的整数类型,一般可将其视为与 int 相近的整型。

与 typedef 结合

若希望省略每次书写 enum 关键字,可用 typedef 为枚举类型起别名:

typedef enum direction {
    EAST, NORTH, WEST, SOUTH
} Dirctn;

Dirctn dir = NORTH;

典型用途

  • 状态机:描述对象或流程的离散状态。
  • 错误码:为返回值赋予统一命名,便于排查。
  • 菜单与用户输入:将选项编号映射为有意义的标识。
  • 权限标志:如 READ、WRITE、EXECUTE 等。

本节介绍了 enum 的声明、默认值规则及与 typedef 的配合。下一节说明预处理器在编译前对源码的处理方式。