枚举值的字符串表示

gcc 4.4.2 c89

我有以下枚举:

enum drop_options_e { drop_ssm, drop_snm, drop_ssb }; 

我只是想知道这是从枚举中获取字符串表示值的最佳方法。

所以基本上,不是为drop_ssm返回值0,而是可以获得’drop_ssm’。

非常感谢任何建议,

一种方法是这样做:

 enum drop_options_e { drop_ssm = 0, drop_snm , drop_ssb , LAST_ENTRY /* Should be last entry */ }; const char* drop_options_s[LAST_ENTRY] = {"drop_ssm", "drop_snm", "drop_ssb"}; 

当你想要枚举的字符串表示时,你可以drop_options_s[enum];

使用X-Macro技术:

档案items

 ITEM(drop_ssm) ITEM(drop_snm) ITEM(drop_ssb) 

资源:

 #define ITEM(A) A, enum drop_options_e { #include "items" last }; #undef ITEMS #define ITEM(A) #A, char item_names[] = { #include "items" NULL}; 

所以现在item_names[drop_ssm]会给你文本字符串"drop_ssm"

C不支持。 你必须在某个地方有一个开关或等同物。

如果你有一个支持C99指定初始化程序的编译器,你可以改进Naveen的答案 :

 enum drop_options_e { drop_ssm, drop_snm, drop_ssb }; #define ENUM_TO_S(e) [e] = #e const char *drop_options_s[] = { ENUM_TO_S(drop_ssm), ENUM_TO_S(drop_snm), ENUM_TO_S(drop_ssb) }; 

(使用此方法,您不必担心数组初始化程序与枚举值的顺序相同)。

开箱即用。 你可以用宏和Boost.Preprocessor做一些非常有趣的事情,但它很复杂,我不确定它在C中的效果如何; 我用C ++做过让我写的东西,例如:

 ENUM( ColorComponent, (red) (green) (blue) (alpha) ); // ... ColorComponent cc = ColorComponent_red; std::cout << "Color: " << toString(cc) << "\n"; 

我看到处理这个问题的最好方法是创建一个翻译数组。 就像是:

 struct { enum drop_options_e value; char *string; } TranslationArray[] = { drop_ssm, "drop_ssm", drop_snm, "drop_snm", drop_ssb, "drop_ssb", }; 

如果你的枚举非常大,这可能会有问题。

我非常喜欢这里的所有答案! 在尝试它们的过程中,我发现了一些非常简短的东西,来自boost的BOOST_PP_STRINGIZE宏:

 //Define the enum you need typedef enum { INTEGER = 0, STRING = 1, BOOLEAN = 2, }eValueType; // Then in code use BOOST_PP_STRINGIZE, for example: char* valueTypeStr = BOOST_PP_STRINGIZE(INTEGER);