C语言的静态映射声明
来源:互联网 发布:数据库两个表关联查询 编辑:程序博客网 时间:2024/05/28 01: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;
}
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;
}
#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"
""
};
#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。用来消除某些编译器的警告。
}
#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。用来消除某些编译器的警告。
}
- C语言的静态映射声明
- C语言的静态映射声明
- C语言的静态变量声明static
- c语言的声明
- c语言的声明
- C语言的声明
- c语言的声明
- C语言的声明
- C语言的声明
- 奇怪的c语言声明
- 分析C语言的声明
- 分析C语言的声明
- 20100623--C语言的声明
- C语言声明的理解
- C语言奇特的声明
- C语言的复杂声明
- 分析C语言的声明
- 复杂的C 语言声明
- 用Win32汇编实现的 读者/写者,写者具有优先权 的问题
- 【解析】什么是HIS、PACS、LIS、RIS
- 三大面试技巧助你飞跃
- 九宫格(只针对行列)
- GridView中DataControlField与Parameter扩展
- C语言的静态映射声明
- feedsky-对他扫兴至极
- 兄弟们,一路走好!
- 基于声卡的数字信号发生器与数字电子琴的实现
- 终于搞定了难缠的IE打开某些页面时因“SysFader:expLorer.exe”错误而异常关闭的问题
- YUV / RGB 格式及快速转换算法
- [安装]TaokeOCS安装全程图解
- javascript操作cookies 以及 正确使用cookies的属性
- JOIN的分類