C 枚举值的字符串表示形式

C 枚举值的字符串表示形式,c,C,通用条款4.4.2 c89 我有以下枚举: enum drop_options_e { drop_ssm, drop_snm, drop_ssb }; 我只是想知道这是从枚举中获取字符串表示值的最佳方法 因此,基本上,我可以得到'drop\u ssm',而不是为drop\u ssm返回值0 非常感谢您的建议,C对此不支持。您必须在某个地方安装开关或等效开关。一种方法是: enum drop_options_e { drop_ssm = 0, drop_s

通用条款4.4.2 c89

我有以下枚举:

enum drop_options_e
{
    drop_ssm,
    drop_snm,
    drop_ssb
};
我只是想知道这是从枚举中获取字符串表示值的最佳方法

因此,基本上,我可以得到'drop\u ssm',而不是为drop\u 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]

没有现成的东西。你可以用宏和Boost.Preprocessor做一些非常有趣的事情,但是它非常复杂,我不确定它在C语言中的效果如何;我已经做了C++的东西,让我写,例如:

ENUM(
    ColorComponent,
    (red)
    (green)
    (blue)
    (alpha)
    );
// ...
ColorComponent cc = ColorComponent_red;
std::cout << "Color: " << toString(cc) << "\n";
ENUM(
颜色成分,
(红色)
(绿色)
(蓝色)
(阿尔法)
);
// ...
ColorComponent cc=ColorComponent_红色;

std::cout处理这个问题的最佳方法是创建一个转换数组。比如:

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

如果您的enum非常大,这可能会有问题。

如果您的编译器支持C99指定的初始化器,您可以改进:

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

使用以下技术:

文件
项目

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\u names[drop\u ssm]
将为您提供文本字符串
“drop\u ssm”
我非常喜欢这里的所有答案!在尝试它们的过程中,我发现BOOST的BOOST\u PP\u 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);

使用X-Macros会更好这看起来是一个很好的答案。但是,为了简单起见,我必须选择Naveen answer。如果此枚举用于多个文件中,为了使此工作正常,我需要使drop_options_成为静态,并且每次枚举文件包含在另一个文件中时,如果drop_options_未被引用,我在编译时会收到警告,是否有一种方法可以在没有所有编译器警告的情况下使用它。这将打印
INTEGER
,为什么不只打印
char*valueTypeStr=“INTEGER”
//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);