C语言的静态映射声明
2010-10-08 10:48:23 来源:WEB开发网核心提示:前段时间,准备设计一个关于出错信息的表,C语言的静态映射声明,每一个错误有一个唯一的ErrID,和对应的错误信息以及其他辅助信息,方法二首先,另外建一个文件,在C语言中,很自然的实现如下:enum{ERR_ID_1,ERR_ID_2,ERR_ID_3,ERR_ID_4}ErrID;constchar*errmsg[]=
前段时间,准备设计一个关于出错信息的表,每一个错误有一个唯一的ErrID,和对应的错误信息以及其他辅助信息。在C语言中,很自然的实现如下:
enum{ ERR_ID_1, ERR_ID_2, ERR_ID_3, ERR_ID_4 }ErrID; constchar*errmsg[]={ "ThisisError1msg",/*ERR_ID_1*/ "ThisisError2msg",/*ERR_ID_2*/ "ThisisError3msg",/*ERR_ID_3*/ "ThisisError4msg" /*ERR_ID_4*/ }; intmain(){ printf("Error=%s",errmsg[ERR_ID_1]); return0; }
这样带来的问题是很不容易维护,必须人为的确定每一个ErrID和它的errmsg相对应。希望能不增加任何时间或空间的开销的情况下,让实现更加的“美观”,更容易维护。自己第一时间能想到的,就是宏或者模板。
方法一
#defineERR_MSG(id,msg)constchar*err_msg_##id=msg; #defineGET_MSG(id)(err_msg_##id) ERR_MSG(ERR_ID_1,"ThisisError1msg") ERR_MSG(ERR_ID_2,"ThisisError2msg") ERR_MSG(ERR_ID_3,"ThisisError3msg") ERR_MSG(ERR_ID_4,"ThisisError4msg") intmain(){ printf("Error=%s",GET_MSG(ERR_ID_1)); return0; }
这个方法的好处在于连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")
在主文件中:
#undefERR_MSG #defineERR_MSG(id,msg)id, enum{ #include"err.txt" MAX_ERR_NUMBER }ERRID; #undefERR_MSG
更多精彩
赞助商链接