当前位置:天才代写 > tutorial > C语言/C++ 教程 > C语言的静态映射声明

C语言的静态映射声明

2017-11-02 08:00 星期四 所属: C语言/C++ 教程 浏览:36

前段时间,筹备设计一个关于堕落信息的表,每一个错误有一个独一的ErrID,和对应的错误信息以及其他帮助信息。在C语言中,很自然的实现如下:

enum {
ERR_ID_1,
ERR_ID_2,
ERR_ID_3,
ERR_ID_4
} ErrID;
const char* errmsg[] = {
"This is Error 1 msg", /*ERR_ID_1*/
"This is Error 2 msg", /*ERR_ID_2*/
"This is Error 3 msg", /*ERR_ID_3*/
"This is Error 4 msg" /*ERR_ID_4*/
};
int main() {
printf("Error= %s", errmsg[ERR_ID_1]);
return 0;
}

这样带来的问题是很不容易维护,必需工钱简直定每一个ErrID和它的errmsg相对应。但愿能不增加任何时间或空间的开销的环境下,让实现越发的“雅观”,更容易维护。本身第一时间能想到的,就是宏可能模板。

要领一

#define ERR_MSG(id, msg) const char* err_msg_##id = msg;
#define GET_MSG(id) (err_msg_##id)

ERR_MSG(ERR_ID_1, "This is Error 1 msg")
ERR_MSG(ERR_ID_2, "This is Error 2 msg")
ERR_MSG(ERR_ID_3, "This is Error 3 msg")
ERR_MSG(ERR_ID_4, "This is Error 4 msg")

int main() {
printf("Error= %s", GET_MSG(ERR_ID_1));
return 0;
}

这个要领的长处在于连errmsg数组的空间都省略掉了。缺点就是

不能支持在运行时通过传入的ErrID来动态抉择输出。

不支持基于errmsg的遍历操纵甚至不知道ErrID的个数。因为errmsg原来就不存在。

要领二

首先,别的建一个文件,好比err.txt,每行的名目如:

ERR_MSG(ERR_ID_1, "This is Error 1 msg")
ERR_MSG(ERR_ID_2, "This is Error 2 msg")
ERR_MSG(ERR_ID_3, "This is Error 3 msg")
ERR_MSG(ERR_ID_4, "This is Error 4 msg")

在主文件中:

#undef ERR_MSG
#define ERR_MSG(id, msg) id,
enum {
#include "err.txt"
MAX_ERR_NUMBER
} ERRID;

#undef ERR_MSG
#define ERR_MSG(id, msg) msg,
const char* errmsg[] = {
#include "err.txt"
""
};

在最后插手一个无用的元素,用来制止某些编译器监测到最尾元素后有逗号时的告诫。

虽然,errmsg数组也不必然需要。好比,可以这样实现一个通过传入的ErrID返回相应errmsg的函数get_err_msg():

#undef ERR_MSG
#define ERR_MSG(id, msg) case id: return msg; break;
const char* get_err_msg(ErrId eid) {
switch (eid) {
#include "err.txt"
}
return NULL; // Dummy。用来消除某些编译器的告诫。
}

 

    关键字:


天才代写-代写联系方式