龙空技术网

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

yasindar 162

前言:

此刻兄弟们对“如何用c语言表示x的n次方”大体比较讲究,各位老铁们都需要分析一些“如何用c语言表示x的n次方”的相关文章。那么小编在网上汇集了一些有关“如何用c语言表示x的n次方””的相关文章,希望兄弟们能喜欢,兄弟们快快来学习一下吧!

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

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: %d\n", ColorNames[i], i);

}

rt_debug("RED Color: %s=%d\n", 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的n次方 #c语言怎么写x的n次方