龙空技术网

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

yasindar 166

前言:

此刻各位老铁们对“n阶乘c语言”都比较注重,我们都想要学习一些“n阶乘c语言”的相关知识。那么小编同时在网摘上搜集了一些对于“n阶乘c语言””的相关知识,希望你们能喜欢,朋友们快快来了解一下吧!

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

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,

};

下期给出答案。

标签: #n阶乘c语言 #报班c语言