枚举类型
枚举(enum)是定义命名整数常量的方式,提高代码可读性和可维护性。C99 中枚举底层类型是 int,枚举常量默认从 0 开始递增,也可以显式指定值。
基本定义
enum Color {
RED, /* 0 */
GREEN, /* 1 */
BLUE /* 2 */
};
enum Color c = RED;
if (c == RED)
printf("Red\n");
显式指定值
enum Status {
OK = 0,
ERROR = 1,
WARNING = 2
};
enum Priority {
LOW = 10,
MEDIUM = 20,
HIGH = 30
};
非连续值
enum Flags {
FLAG_A = 1, /* 0b0001 */
FLAG_B = 2, /* 0b0010 */
FLAG_C = 4, /* 0b0100 */
FLAG_D = 8 /* 0b1000 */
};
int flags = FLAG_A | FLAG_C; /* 组合标志 */
if (flags & FLAG_A)
printf("Flag A is set\n");
typedef 简化
typedef enum {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
} Weekday;
Weekday today = MONDAY;
枚举的大小
enum Color c;
printf("%zu\n", sizeof(c)); /* sizeof(int) */
C 标准规定枚举兼容 int,但具体大小由实现决定。
常见错误
枚举与整数混淆:
enum Color c = 5; /* 警告:5 不是枚举值 */
c = 10; /* 合法但危险 */
重复值:
enum Status {
OK = 0,
ERROR = 0 /* 允许但容易混淆 */
};
最佳实践
- 用枚举替代魔法数字
- 标志枚举用 2 的幂次方值
- 用 typedef 简化枚举类型
- switch 语句处理枚举时加 default