猿问

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

有简单的方法将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中,所以使用到目前为止提出的解决方案并不是一种选择。


慕虎7371278
浏览 2497回答 3
3回答

慕工程0101907

你可能想退房GCCXML.在示例代码上运行GCCXML会产生以下结果:<GCC_XML> &nbsp;&nbsp;<Namespace&nbsp;id="_1"&nbsp;name="::"&nbsp;members="_3&nbsp;"&nbsp;mangled="_Z2::"/> &nbsp;&nbsp;<Namespace&nbsp;id="_2"&nbsp;name="std"&nbsp;context="_1"&nbsp;members=""&nbsp;mangled="_Z3std"/> &nbsp;&nbsp;<Enumeration&nbsp;id="_3"&nbsp;name="MyEnum"&nbsp;context="_1"&nbsp;location="f0:1"&nbsp;file="f0"&nbsp;line="1"> &nbsp;&nbsp;&nbsp;&nbsp;<EnumValue&nbsp;name="FOO"&nbsp;init="0"/> &nbsp;&nbsp;&nbsp;&nbsp;<EnumValue&nbsp;name="BAR"&nbsp;init="80"/> &nbsp;&nbsp;</Enumeration> &nbsp;&nbsp;<File&nbsp;id="f0"&nbsp;name="my_enum.h"/></GCC_XML>您可以使用任何您喜欢的语言来提取枚举和EnumValue标记并生成所需的代码。

繁花如伊

X-宏是最好的解决方案。例子:#include&nbsp;<iostream>enum&nbsp;Colours&nbsp;{#&nbsp;&nbsp;&nbsp;define&nbsp;X(a)&nbsp;a,#&nbsp;&nbsp;&nbsp;include&nbsp;"colours.def"#&nbsp;&nbsp;&nbsp;undef&nbsp;X &nbsp;&nbsp;&nbsp;&nbsp;ColoursCount};char&nbsp;const*&nbsp;const&nbsp;colours_str[]&nbsp;=&nbsp;{#&nbsp;&nbsp;&nbsp;define&nbsp;X(a)&nbsp;#a,#&nbsp;&nbsp;&nbsp;include&nbsp;"colours.def"#&nbsp;&nbsp;&nbsp;undef&nbsp;X &nbsp;&nbsp;&nbsp;&nbsp;0};std::ostream&&nbsp;operator<<(std::ostream&&nbsp;os,&nbsp;enum&nbsp;Colours&nbsp;c){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(c&nbsp;>=&nbsp;ColoursCount&nbsp;||&nbsp;c&nbsp;<&nbsp;0)&nbsp;return&nbsp;os&nbsp;<<&nbsp;"???"; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;os&nbsp;<<&nbsp;colours_str[c];}int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;Red&nbsp;<<&nbsp;Blue&nbsp;<<&nbsp;Green&nbsp;<<&nbsp;Cyan&nbsp;<<&nbsp;Yellow&nbsp;<<&nbsp;Magenta&nbsp;<<&nbsp;std::endl;}色系:X(Red)X(Green)X(Blue)X(Cyan)X(Yellow)X(Magenta)但是,我通常更喜欢下面的方法,这样就可以稍微修改字符串了。#define&nbsp;X(a,&nbsp;b)&nbsp;a,#define&nbsp;X(a,&nbsp;b)&nbsp;b,X(Red,&nbsp;"red")X(Green,&nbsp;"green")//&nbsp;etc.

Qyouu

没有额外的文件:#define&nbsp;SOME_ENUM(DO)&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;DO(Foo)&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;DO(Bar)&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;DO(Baz)#define&nbsp;MAKE_ENUM(VAR)&nbsp;VAR,enum&nbsp;MetaSyntacticVariable{ &nbsp;&nbsp;&nbsp;&nbsp;SOME_ENUM(MAKE_ENUM)};#define&nbsp;MAKE_STRINGS(VAR)&nbsp;#VAR,const&nbsp;char*&nbsp;const&nbsp;MetaSyntacticVariableNames[]&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;SOME_ENUM(MAKE_STRINGS)};
随时随地看视频慕课网APP
我要回答