首页 > 后端开发 > C++ > 如何轻松地将 C 枚举转换为字符串、处理 Typedef 和未命名枚举?

如何轻松地将 C 枚举转换为字符串、处理 Typedef 和未命名枚举?

Patricia Arquette
发布: 2024-12-15 21:05:32
原创
966 人浏览过

How Can I Easily Convert C   Enums to Strings, Handling Typedefs and Unnamed Enums?

轻松将 C 枚举转换为字符串

假设您在 C 代码中遇到命名枚举:

enum MyEnum {
      FOO,
      BAR = 0x50
};
登录后复制

并且您寻求一个脚本来生成一个标头,该标头具有每个的转换功能enum:

char* enum_to_string(MyEnum t);
登录后复制

通过像这样的简单实现:

char* enum_to_string(MyEnum t){
      switch(t){
         case FOO:
            return "FOO";
         case BAR:
            return "BAR";
         default:
            return "INVALID ENUM";
      }
 }
登录后复制

但是,对于类型定义的枚举和未命名的 C 枚举,事情会变得棘手。让我们深入研究最佳解决方案:

X-Macros:冠军

X-macros 成为首选,提供了一个优雅的解决方案:

#include <iostream>

enum Colours {
#   define X(a) a,
#   include "colours.def"
#   undef X
    ColoursCount
};

char const* const colours_str[] = {
#   define X(a) #a,
#   include "colours.def"
#   undef X
    0
};

std::ostream&amp; operator<<(std::ostream&amp; os, enum Colours c)
{
    if (c >= ColoursCount || c < 0) return os << "???";
    return os << colours_str[c];
}

int main()
{
    std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl;
}
登录后复制

随附文件“colours.def”包含:

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)
登录后复制

自定义字符串输出

为了增加灵活性,您可以调整字符串输出:

#define X(a, b) a,
#define X(a, b) b,

X(Red, "red")
X(Green, "green")
// etc.
登录后复制

以上是如何轻松地将 C 枚举转换为字符串、处理 Typedef 和未命名枚举?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板