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数组的空间都省略掉了。缺点就是

  1. 不能支持在运行时通过传入的ErrID来动态决定输出。
  2. 不支持基于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。用来消除某些编译器的警告。
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值