上期回顾
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