枚举值的字符串表示形式

时间:2010-03-30 06:56:20

标签: c

gcc 4.4.2 c89

我有以下枚举:

enum drop_options_e
{
    drop_ssm,
    drop_snm,
    drop_ssb
};

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

所以基本上,不是为drop_ssm返回值0,而是可以改为'drop_ssm'。

非常感谢任何建议,

7 个答案:

答案 0 :(得分:10)

一种方法是这样做:

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];

答案 1 :(得分:4)

使用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"

答案 2 :(得分:3)

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

答案 3 :(得分:3)

如果你有一个支持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)
};

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

我看到处理此问题的最佳方法是创建转换数组。类似的东西:

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

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

答案 6 :(得分:-1)

我非常喜欢这里的所有答案!在尝试它们的过程中,我发现了一些非常简短的东西,来自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);
相关问题