是否可以在 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/