一种方法是让预处理器来做这项工作.它还可以确保枚举和字符串同步.
#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和enum:
#define foo apple
int main() {
printf("%s\n", str(foo));
printf("%s\n", xstr(foo));
}
结果将是:
foo
apple
这是因为str将字符串化输入foo,而不是将其扩展为apple.通过使用xstr,首先进行宏扩展,然后将结果字符串化.
更多信息请参见Stringification.