C语言枚举
一、枚举的基本定义与使用
1. 简单枚举
enum Weekday {
MONDAY, // 默认值为0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
};
// 定义枚举变量
enum Weekday today = WEDNESDAY;
2. 指定枚举值
enum Color {
RED = 101,
GREEN = 202,
BLUE = 303
};
enum Color favorite = GREEN; // favorite的值为202
3. 混合赋值
enum Numbers {
ZERO, // 0
ONE, // 1
FIVE = 5, // 显式赋值为5
SIX, // 6(自动递增)
TEN = 10 // 显式赋值为10
};
二、枚举的实际应用场景
1. 状态机
enum ConnectionStatus {
DISCONNECTED,
CONNECTING,
CONNECTED,
ERROR
};
enum ConnectionStatus status = DISCONNECTED;
void handleConnection() {
switch(status) {
case DISCONNECTED:
// 执行连接逻辑
status = CONNECTING;
break;
case CONNECTED:
// 处理已连接状态
break;
// 其他状态...
}
}
2. 错误码
enum ErrorCode {
SUCCESS = 0,
FILE_NOT_FOUND = -1,
INVALID_INPUT = -2,
MEMORY_ERROR = -3
};
enum ErrorCode readFile(const char *path) {
if (fileExists(path)) {
return SUCCESS;
} else {
return FILE_NOT_FOUND;
}
}
3. 配置选项
enum DisplayMode {
MODE_2D = '2',
MODE_3D = '3',
MODE_VR = 'V'
};
void setDisplayMode(enum DisplayMode mode) {
switch(mode) {
case MODE_2D:
printf("2D模式已启用\n");
break;
case MODE_3D:
printf("3D模式已启用\n");
break;
// ...
}
}
三、枚举与typedef结合
typedef enum {
SMALL,
MEDIUM,
LARGE
} Size; // 定义别名Size
// 使用typedef后的枚举
Size shirtSize = MEDIUM;
四、枚举与整数的关系
-
枚举值本质是整数
enum Flag { TRUE = 1, FALSE = 0 }; int isActive = TRUE; // 合法:枚举值可隐式转换为int -
整数转换为枚举(需显式强制类型转换)
enum Color c = (enum Color)2; // 将整数2转换为enum Color类型 -
枚举值的范围
enum Numbers { MIN = -100, MAX = 100 }; enum Numbers num = 200; // 编译警告:超出枚举定义范围
五、枚举的高级用法
1. 枚举作为函数参数
typedef enum {
UP,
DOWN,
LEFT,
RIGHT
} Direction;
void movePlayer(Direction dir) {
switch(dir) {
case UP:
player.y--;
break;
case DOWN:
player.y++;
break;
// ...
}
}
2. 位掩码枚举(用于组合多个选项)
typedef enum {
OPTION_NONE = 0, // 0000
OPTION_READ = 1 << 0, // 0001
OPTION_WRITE = 1 << 1, // 0010
OPTION_EXEC = 1 << 2 // 0100
} FilePermissions;
// 组合多个选项
FilePermissions permissions = OPTION_READ | OPTION_WRITE; // 0011
// 检查选项
if (permissions & OPTION_WRITE) {
printf("具有写入权限\n");
}
六、枚举的注意事项
-
避免重复值
enum Conflicting { A = 1, B = 1 // 编译警告:重复值 }; -
枚举变量的大小
enum Small { A, B, C }; // 通常占用4字节(int大小) printf("%zu\n", sizeof(enum Small)); // 输出:4(多数系统) -
跨平台兼容性
- 枚举底层类型在不同编译器中可能不同(如
int或unsigned int) - 建议使用
typedef enum配合固定大小的整数类型(如uint8_t)提高兼容性
- 枚举底层类型在不同编译器中可能不同(如
七、完整示例:枚举综合应用
#include <stdio.h>
// 定义HTTP状态码枚举
typedef enum {
HTTP_OK = 200,
HTTP_CREATED = 201,
HTTP_BAD_REQUEST = 400,
HTTP_NOT_FOUND = 404,
HTTP_INTERNAL_ERROR = 500
} HttpStatus;
// 获取状态码描述
const char* getStatusMessage(HttpStatus status) {
switch(status) {
case HTTP_OK:
return "OK";
case HTTP_CREATED:
return "Created";
case HTTP_NOT_FOUND:
return "Not Found";
default:
return "Unknown";
}
}
int main() {
HttpStatus response = HTTP_NOT_FOUND;
printf("Status Code: %d\n", response);
printf("Message: %s\n", getStatusMessage(response));
// 检查错误状态
if (response >= 400) {
printf("请求失败!\n");
}
return 0;
}

浙公网安备 33010602011771号