(c语言必背100行代码)(c语言必背100代码pdf)

上期回顾

X-Macros基本用法,可以define一组数据,其实和普通的define没有什么区别,与其说是一种技术,还不如说是define用法的一个技巧。不过,上期最后提出一个问题,请看:

ColorNames[RED]中RED的值为0,所以ColorNames[RED]等价于ColorNames[0],那么如果颜色的宏定义不是从0开始,或者随机的数,怎么办呢?

enum Color {

RED = 99,

GREEN = 9,

BLUE = 0,

};

本期内容

X-Macros的另一个用法,可以构造一组数据结构,类似高级语言里的字典类型。程序如下:

// 定义X-Macros,其中X为COLOR

#define COLOR_LIST \

COLOR(RED, 99) \

COLOR(GREEN, 87) \

COLOR(BLUE, 88)

这样就可以实现enum枚举类型里值不联系的问题。这样一来,怎么根据前面的字符串来打印呢?程序如下:

// 定义X-Macros,其中X为COLOR

#define COLOR_LIST \

COLOR(RED, 99) \

COLOR(GREEN, 87) \

COLOR(BLUE, 88)

enum Color {

#define COLOR(name, value) name = value,

COLOR_LIST

#undef COLOR

};

const char* ColorNames[] = {

#define COLOR(name, value) #name,

COLOR_LIST

#undef COLOR

};

const int ColorIndexes[] = {

#define COLOR(name, value) value,

COLOR_LIST

#undef COLOR

};

const char* getColorName(enum Color color) {

// for (int i = 0; i < sizeof(ColorIndexes) / sizeof(int); ++i) {

// if (color == ColorIndexes[i]) {

// return ColorNames[i];

// }

// }

// return NULL;

switch (color) {

#define COLOR(name, value) case name: return #name;

COLOR_LIST

#undef COLOR

default: return "Unknown";

}

}

void test( void )

{

for (int i = 0; i < sizeof(ColorNames) / sizeof(const char*); ++i) {

rt_debug("Color: %s, index: %d\n", ColorNames[i], i);

}

rt_debug("RED Color: %s=%d\n", getColorName(RED), RED);

}

解析:定义完数据结构以后,再构造一个索引数组ColorIndexes,用来存储Value与对应字符串之间的关系。getColorName获得打印的名字,在应用中就可以使用rt_debug("RED Color: %s=%d\n", getColorName(RED), RED);直接打印字典中KEY与VALUE了。

X-Macros使用简单方便,使代码看起来优美,不臃肿,也减少很多if,else的使用,易于阅读。其实,X-Macros不仅仅打印枚举名字,还可以做更深入的应用。下期介绍X-Macros管理系统错误代码的输出。

老杨只讲思路,没有套路。关注老杨,谢谢!

声明:我要去上班所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者yasindar所有,原文出处。若您的权利被侵害,请联系删除。

本文标题:(c语言必背100行代码)(c语言必背100代码pdf)
本文链接:https://www.51qsb.cn/article/m89ty.html

(0)
打赏微信扫一扫微信扫一扫QQ扫一扫QQ扫一扫
上一篇2023-06-12
下一篇2023-06-12

你可能还想知道

发表回复

登录后才能评论