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