前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >枚举转字符串

枚举转字符串

作者头像
开源519
发布2022-12-01 16:12:18
9190
发布2022-12-01 16:12:18
举报
文章被收录于专栏:开源519

枚举转字符串

  • 1.开篇
  • 2.实现原理
  • 3.代码实现
  • 4.实例调试
  • 5.总结

1.开篇

  在代码调试时,我们经常需要直观地定位当前枚举变量为哪个枚举常量。通常通过打印枚举值就可以确定,但是当枚举常量表过多时,就不那么直观了。本篇记录一种C/C++枚举变量转字符串的实用技巧。

2.实现原理

  在学习C语言宏的时候,有看到 “#” 在宏(#define)中有一些特殊的用法,这里先回顾一下:

  • #: 预处理阶段,将宏参数转化为字符串
  • ##: 预处理阶段,将两个标识符拼接成一个标识符

  通过第一个用法,如果能够将 “#” 与枚举结合起来,似乎就能实现枚举转成字符串了。如何实现呢? 经过一次次迭代,大佬们给后辈实现了一种实用的技巧。

3.代码实现

① 首先,将需要的枚举名放到固定的地方统一管理(signal_list.gen)。

代码语言:javascript
复制
// signal_list.gen
ENUM_OR_STRING(LED_OPEN),                   \
ENUM_OR_STRING(LED_CLOSE),                  \
ENUM_OR_STRING(MSG_TEST),                   \
ENUM_OR_STRING(MSG_BUTT)                    \

signal_list.gen用于管理使用的枚举名。

② 其次,声明枚举(signal_id.h)

代码语言:javascript
复制
// signal_id.h
/* 消息ID转枚举 */
#ifdef ENUM_OR_STRING
#undef ENUM_OR_STRING
#endif
#define ENUM_OR_STRING(x) x

typedef enum
{
    #include "signal_list.gen"
} E_MSG_ID;
  • ENUM_OR_STRING(x) 替换成 x
  • 包含signal_list.gen,将.gen文件的内容定义成枚举。

③ 最后,实现获取枚举字符串方法(signal_id.cc)

代码语言:javascript
复制
#ifdef ENUM_OR_STRING
#undef ENUM_OR_STRING
#endif
#define ENUM_OR_STRING(x) #x

const int MAX_LENGTH_MSG = 50;
const char msgIdString[][MAX_LENGTH_MSG] = {
    #include "signal_list.gen"
};

const char *GetMsgName(int msgID)
{
    return msgIdString[msgID];
}
  • ENUM_OR_STRING(x) 替换成 #x,完成宏转字符串操作。
  • 包含signal_list.gen,将.gen的内容定义成字符串。
  • 通过GetMsgName返回指定枚举对应的字符串。

4.实例调试

  • 调试代码
代码语言:javascript
复制
#define LOGD(fmt, args...) printf("%d DemoSignal D: " fmt, __LINE__, ##args)

int main(int argc, char *argv[])
{
    LOGD("Msg id [%d] name [%s]\n", MSG_TEST, GetMsgName(MSG_TEST));
    return 0;
}
  • 调试打印
代码语言:javascript
复制
28 DemoSignal D: Msg id [2] name [MSG_TEST]

5.总结

  • 在此前面对此类需求时,通常是定义一个下标与枚举一致的数组来记录枚举字符串。此种方法在维护时,往往出现更新枚举后,数组忘记更新,又难以发现。
  • 多看一些经典的代码,从中学习实用的技巧,提升自身代码能力。

最后

用心感悟,认真记录,写好每一篇文章,分享每一框干货。

更多文章内容包括但不限于C/C++、Linux、开发常用神器等,可进入“开源519公众号”聊天界面输入“文章目录” 或者 菜单栏选择“文章目录”查看。公众号后台聊天框输入本文标题,在线查看源码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源519 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 枚举转字符串
    • 1.开篇
      • 2.实现原理
        • 3.代码实现
          • 4.实例调试
            • 5.总结
              • 最后
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档