admin管理员组

文章数量:1443539

C/C++获取枚举值名称

  1. 首先,COLOR_ENUM宏定义了一个枚举列表模板,这是一个X宏技巧,它允许我们用不同的方式重用同一个枚举列表。
代码语言:c代码运行次数:0运行复制
#define COLOR_ENUM(X) \
    X(RED)           \
    X(GREEN)         \
    X(BLUE)

2 DECLARE_ENUM宏用于生成枚举定义

代码语言:c代码运行次数:0运行复制
#define DECLARE_ENUM(name) name,

3 定义枚举变量

代码语言:c代码运行次数:0运行复制
enum Color { COLOR_ENUM(DECLARE_ENUM) };

当这个宏与COLOR_ENUM组合使用时:预处理器会展开为:

代码语言:c代码运行次数:0运行复制
enum Color {
    RED,
    GREEN,
    BLUE
};

4 定义ENUM_CASE宏;用于生成switch语句的case分支:

这里的#name是字符串化操作符,它会将宏参数转换为字符串字面量。

代码语言:c代码运行次数:0运行复制
#define ENUM_CASE(name) case name: return #name;

5 xx_to_string 函数定义

代码语言:c代码运行次数:0运行复制
const char *color_to_string(enum Color color) {
  switch (color) {
    COLOR_ENUM(ENUM_CASE)
  default:
    return "UNKNOWN";
  }
}

预处理器会展开为

代码语言:c代码运行次数:0运行复制
const char *color_to_string(enum Color color) {
    switch (color) {
        case RED: return "RED";
        case GREEN: return "GREEN";
        case BLUE: return "BLUE";
    default:
        return "UNKNOWN";
    }
}

这种实现的优点是:

  1. 维护方便:只需要在COLOR_ENUM宏中添加或删除枚举值,所有相关代码都会自动更新
  2. 避免重复:不需要手动维护枚举值和字符串的对应关系
  3. 编译时检查:如果漏掉了某个枚举值,编译器会给出警告
  4. 性能好:使用switch语句比查表更快
  5. 内存效率高:字符串直接存储在代码段,不需要额外的运行时数据结构

缺点是:

  1. 宏的使用使代码不太直观
  2. 调试时可能不太方便,因为需要查看预处理后的代码
  3. 所有枚举值必须在同一个地方定义

本文标签: CC获取枚举值名称