c - 如何在c中将枚举名称转换为字符串

标签 c string enums

是否可以在 C 中将枚举器名称转换为字符串?

最佳答案

一种方法,让预处理器完成工作。它还确保您的枚举和字符串同步。

#define FOREACH_FRUIT(FRUIT) \
        FRUIT(apple)   \
        FRUIT(orange)  \
        FRUIT(grape)   \
        FRUIT(banana)  \

#define GENERATE_ENUM(ENUM) ENUM,
#define GENERATE_STRING(STRING) #STRING,

enum FRUIT_ENUM {
    FOREACH_FRUIT(GENERATE_ENUM)
};

static const char *FRUIT_STRING[] = {
    FOREACH_FRUIT(GENERATE_STRING)
};

预处理器完成后,您将拥有:

enum FRUIT_ENUM {
    apple, orange, grape, banana,
};

static const char *FRUIT_STRING[] = {
    "apple", "orange", "grape", "banana",
};

然后你可以这样做:

printf("enum apple as a string: %s\n",FRUIT_STRING[apple]);

如果用例实际上只是打印枚举名称,请添加以下宏:

#define str(x) #x
#define xstr(x) str(x)

然后做:

printf("enum apple as a string: %s\n", xstr(apple));

在这种情况下,二级宏似乎是多余的,但是,由于字符串化在 C 中的工作方式,在某些情况下是必要的。例如,假设我们要使用带枚举的#define:

#define foo apple

int main() {
    printf("%s\n", str(foo));
    printf("%s\n", xstr(foo));
}

输出将是:

foo
apple

这是因为 str 会将输入 foo 字符串化,而不是将其扩展为 apple。通过使用 xstr,首先完成宏扩展,然后将结果字符串化。

参见 Stringification获取更多信息。

关于c - 如何在c中将枚举名称转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9907160/

相关文章:

c - 使用字符串连接的宏

java - 在没有 .split() 的情况下对字符串中的所有数字求和

c - 即使使用 exit(),程序读取行时也会出现 3 次内存泄漏

c - ARM故意膨胀编译代码?

Java字符串到不同格式的日期转换

mysql - 给定的数据类型 enum() 包含错误 mysql

c# - 如何将字符串转换为枚举

java - 以可读的方式使用枚举

c - 为指针及其数据分配的内存在哪里?

C - chmod() 不改变权限