为了账号安全,请及时绑定邮箱和手机立即绑定

有简单的方法将C+枚举转换成字符串吗?

有简单的方法将C+枚举转换成字符串吗?

C++
慕虎7371278 2019-07-04 13:51:41
有简单的方法将C+枚举转换成字符串吗?假设我们有一些命名的枚举:enum MyEnum {       FOO,       BAR = 0x50};我在google中搜索的是一个脚本(任何语言),它扫描项目中的所有标头,并生成一个每个枚举都有一个函数的标头。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样式枚举。有人知道这件事吗?编辑:除了生成的函数之外,解决方案不应该修改我的源代码。枚举在API中,所以使用到目前为止提出的解决方案并不是一种选择。
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

你可能想退房GCCXML.

在示例代码上运行GCCXML会产生以下结果:

<GCC_XML>
  <Namespace id="_1" name="::" members="_3 " mangled="_Z2::"/>
  <Namespace id="_2" name="std" context="_1" members="" mangled="_Z3std"/>
  <Enumeration id="_3" name="MyEnum" context="_1" location="f0:1" file="f0" line="1">
    <EnumValue name="FOO" init="0"/>
    <EnumValue name="BAR" init="80"/>
  </Enumeration>
  <File id="f0" name="my_enum.h"/></GCC_XML>

您可以使用任何您喜欢的语言来提取枚举和EnumValue标记并生成所需的代码。


查看完整回答
反对 回复 2019-07-04
?
繁花如伊

TA贡献2012条经验 获得超12个赞

X-宏是最好的解决方案。例子:

#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& operator<<(std::ostream& 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;}

色系:

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.


查看完整回答
反对 回复 2019-07-04
?
Qyouu

TA贡献1786条经验 获得超11个赞

没有额外的文件:

#define SOME_ENUM(DO) \
    DO(Foo) \
    DO(Bar) \
    DO(Baz)#define MAKE_ENUM(VAR) VAR,enum MetaSyntacticVariable{
    SOME_ENUM(MAKE_ENUM)};#define MAKE_STRINGS(VAR) #VAR,const char* const MetaSyntacticVariableNames[] = {
    SOME_ENUM(MAKE_STRINGS)};


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 2496 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信