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;

四、枚举与整数的关系

  1. 枚举值本质是整数

    enum Flag { TRUE = 1, FALSE = 0 };
    int isActive = TRUE;  // 合法:枚举值可隐式转换为int
    
  2. 整数转换为枚举(需显式强制类型转换)

    enum Color c = (enum Color)2;  // 将整数2转换为enum Color类型
    
  3. 枚举值的范围

    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");
}

六、枚举的注意事项

  1. 避免重复值

    enum Conflicting {
        A = 1,
        B = 1  // 编译警告:重复值
    };
    
  2. 枚举变量的大小

    enum Small { A, B, C };  // 通常占用4字节(int大小)
    printf("%zu\n", sizeof(enum Small));  // 输出:4(多数系统)
    
  3. 跨平台兼容性

    • 枚举底层类型在不同编译器中可能不同(如intunsigned 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;
}

posted @ 2025-06-27 13:31  RaLi  阅读(0)  评论(0)    收藏  举报  来源