枚举(enum)用于为一组相关的整数常量赋予可读的名字,常用于状态码、错误码、菜单选项等场景,可避免在代码中散落未经说明的魔法数字。
基本枚举类型
若用裸整数表示运算种类,含义往往不直观:
int op = 2; /* 2 表示何种运算,需查文档或注释 */可用枚举为常量命名:
enum calculate { SUM, DIFFERENCE, PRODUCT, QUOTIENT };未显式赋值的枚举常量从 0 起依次递增:SUM 为 0,DIFFERENCE 为 1,PRODUCT 为 2,QUOTIENT 为 3。使用示例:
#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 的配合。下一节说明预处理器在编译前对源码的处理方式。