C语言的静态映射声明
前段时间,筹备设计一个关于堕落信息的表,每一个错误有一个独一的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。用来消除某些编译器的告诫。
}