首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C/C++获取枚举值名称

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

原创
作者头像
jasong
发布2025-03-26 17:32:05
发布2025-03-26 17:32:05
50100
代码可运行
举报
文章被收录于专栏:C/C++C/C++
运行总次数:0
代码可运行
  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. 所有枚举值必须在同一个地方定义

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档