一种简单实用的错误码构建方法
作者:水煮鱼
时间:2007-7-24 夜
版权申明:本文为水煮鱼为水煮鱼@Donews撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。
当进行软件设计的时候,很多人都喜欢在函数中加入调试信息以方便对问题的定位(当然也可以使用断言,但是由于很多人对断言的使用原则把握不是很清楚,因此也造成了断言的乱用和滥用等现象)。
加入调试信息的缺点是使得代码变得非常冗余。当代码规模较小的时候,其缺点还不易察觉,但是当软件规模变得越加庞大的时候,调试信息的缺点就会暴露出来了:
1、冗余代码降低了代码的效率
2、由于每人编码风格的不一致,使得调试信息最终五花八门,降低了代码的专业性和可维护性。
3、如果是多CPU系统,调试信息会降低系统有限的通信带宽,导致整机系统通信效率的降低。
因此,本文推荐在系统设计中采用这样一种简单而有效的错误码构造方式。
包括两个部分:
首先是错误码的构造方法:
采用比特构造发,也就是通过比特位传递函数的调用关系。如果函数出现调用错误,可以通过查看返回的错误码准确定位到出现问题的函数。
具体方法如下:
/**************************************************************
This
program is to show how to design error
code!!!!!
***************************************************************/
/*definition of error code*/
#define ERROR_FUNC_1 0x01
/*0000 0001*/
#define ERROR_FUNC_2 0x02 /*0000
0010*/
#define ERROR_FUNC_3 0x04 /*0000 0100*/
#define
ERROR_FUNC_4 0x08 /*0000 1000*/
.........
#define
ERROR_FUNC_8 0x80 /*1000 0000*/
/*the definition of function*/
ERR_CODE func_1 ()
{
..........
return ERROR_FUNC_1;
}
ERR_CODE func_2 ()
{
ERR_CODE ulRet;
ulRet = func_1 ();
return ERROR_FUNC_2 | ulRet;
}
ERR_CODE func_3 ()
{
ERR_CODE ulRet;
ulRet = func_2 ();
return ERROR_FUNC_3 | ulRet;
}
..........
ERR_CODE func_8 ()
{
ERR_CODE ulRet;
ulRet = func_7 ();
return ERROR_FUNC_8 | ulRet;
}
其第二部分主要就是考虑提供错误码解析模块。
如果总是通过查看错误码和函数的调用关系,太过繁琐。通过错误码解析模块可以对错误码进行统一管理,这样也在很大程度上减小了规范性的影响。
如果对于多CPU系统,可以将该部分工作放在主用系统上完成。这样做到了错误码的统一管理,提高了其规范性。
===============================================
我相信很多朋友在工作中都用到的上述方法,在此我仅仅是抛砖引玉。不过我想表达的意思是:在工作前确定标准是何其重要。尽管上述方法非常简单,但是在实际的工作中有多少项目能够做到?不要说整个软件的风格一致或者相似,就是一个项目的几个人的编码风格也千奇百怪。这也是为什么越是成熟的软件公司越是注重编程规范的细节。因为只要规范,才能传承,只有传承才会有积累,只有积累才会有不断的进步,只有不断的进步,才有最终的强大。