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

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

Patricia Arquette
Patricia Arquette原创
2024-12-15 21:05:32968浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn