有没有办法显示枚举值的名称?说我们有:
enum fuits{
APPLE,
MANGO,
ORANGE,
};
main(){
enum fruits xFruit = MANGO;
...
printf("%s",_PRINT_ENUM_STRING(xFruit));
...
}
Run Code Online (Sandbox Code Playgroud)
使用预处理器
#define _PRINT_ENUM_STRING(x) #x
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为我们需要获取变量'x'的值,然后将其转换为字符串.这在c/C++中是否可行?
您可以使用预处理器来执行此操作,我相信这种技术称为X-Macros:
/* fruits.def */
X(APPLE)
X(MANGO)
X(ORANGE)
/* file.c */
enum fruits {
#define X(a) a,
#include "fruits.def"
#undef X
};
const char *fruit_name[] = {
#define X(a) #a,
#include "fruits.def"
#undef X
};
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个条目包含一个尾随逗号,在C99中允许使用(但在C89中不允许).如果这是一个问题,您可以添加sentinal值.通过为自定义名称或枚举值等提供多个参数,也可以使宏更复杂:
X(APPLE, Apple, 2)
#define X(a,b,c) a = c, /* in enum */
#define X(a,b,c) [c] = #b, /* in name array */
Run Code Online (Sandbox Code Playgroud)
限制:你不能有负常数,你的数组也是sizeof (char *) * largest_constant.但是你可以通过使用额外的查找表来解决这两个问题:
int map[] = {
#define X(a,b,c) c,
#include "fruits.def"
#undef X
};
Run Code Online (Sandbox Code Playgroud)
这当然不起作用.什么工作生成一组额外的enum常量作为名称的键:
enum fruits {
#define X(a,b,c) a ## _KEY,
#include "fruits.def"
#undef X
#define X(a,b,c) a = c,
#include "fruits.def"
#undef X
};
Run Code Online (Sandbox Code Playgroud)
现在您可以X(PINEAPPLE, Pineapple, -40)通过使用找到名称fruit_name[PINEAPPLE_KEY].
人们注意到他们不喜欢额外的包含文件.你不需要这个额外的文件,你也使用了#define.这可能更适合小型列表:
#define FRUIT_LIST X(APPLE) X(ORANGE)
Run Code Online (Sandbox Code Playgroud)
并替换#include "fruits.def与FRUIT_LIST前面的例子.