C语言之X-Macros使用,打印枚举名字

大家都知道,枚举类型是一组整型类型的数据,我们为了程序容易阅读而设计枚举类型 , 比如定义颜色:

enum Color { RED,GREEN,BLUE };
我们可以在程序直接使用RED来代表红色 。那么,有一个问题,我们在调试的时候想打印“RED”怎么办呢?
使用X-Macros技术可以解决上述问题 。代码如下:
// 定义X-Macros,其中X为COLOR
#define COLOR_LIST
COLOR(RED)
COLOR(GREEN)
COLOR(BLUE)
#define COLOR(name) name,
enum Color {
COLOR_LIST
};
#undef COLOR
#define COLOR(name) #name,
const char* ColorNames[] = {
COLOR_LIST
};
#undef COLOR
void test( void )
{
for (int i = 0; i < sizeof(ColorNames) / sizeof(const char*);i) {
rt_debug("Color: %s, Value: %dn", ColorNames[i], i);
}


rt_debug("RED Color: %s=%dn", ColorNames[RED], RED);
}
上述例子中,先定义COLOR_LIST,一组颜色的宏定义 。然后定义enum Color颜色枚举 。再定义const char* ColorNames[]颜色字符串数组;其中有一个小知识点,这里讲一下,#undef COLOR是取消宏定义的意思 。这个可以控制宏定义的作用域 。还有一个小知识点,#name,代表name代替的字符串,比如“RED”;
在test中 , 可以直接用ColorNames[RED]来打印RED字符串了 。
最后,我有一个疑问 , 请大家思考,ColorNames[RED]中RED的值为0,所有ColorNames[RED]等价于ColorNames[0],那么如果颜色的宏定义不是从0开始,或者随机的数,怎么办呢?
enum Color {
RED = 99,
GREEN = 9 ,
BLUE = 0,
};
【C语言之X-Macros使用,打印枚举名字】下期给出答案 。

相关经验推荐