c – 显示枚举值名称的通用方法

前端之家收集整理的这篇文章主要介绍了c – 显示枚举值名称的通用方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法显示枚举值名称
说我们有:
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”.

猜你在找的C&C++相关文章