【发布时间】:2010-03-30 06:56:19
【问题描述】:
gcc 4.4.2 c89
我有以下枚举:
enum drop_options_e
{
drop_ssm,
drop_snm,
drop_ssb
};
我只是想知道这是从枚举中获取字符串表示值的最佳方法。
所以基本上,我可以得到“drop_ssm”,而不是为 drop_ssm 返回值 0。
非常感谢您的建议,
【问题讨论】:
标签: c
gcc 4.4.2 c89
我有以下枚举:
enum drop_options_e
{
drop_ssm,
drop_snm,
drop_ssb
};
我只是想知道这是从枚举中获取字符串表示值的最佳方法。
所以基本上,我可以得到“drop_ssm”,而不是为 drop_ssm 返回值 0。
非常感谢您的建议,
【问题讨论】:
标签: c
一种方法是这样做:
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's answer:
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);
【讨论】:
INTEGER,为什么不只打印char* valueTypeStr = "INTEGER"?