软件编程规范
back_sum = sum; /* backup sum */
建议7-2:对模块中函数的划分及组织方式进行分析、优化,改进模块中函数的组织结构,提高程序效率。
说明:软件系统的效率主要与算法、处理任务方式、系统功能及函数结构有很大关系,仅在代码上下功夫一般不能解决根本问题。
建议7-3:避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。
说明:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外,而有关的则不可以。
示例:如下代码效率稍低。
for (ind = 0; ind < MAX_RECT_NUMBER; ind++) {
if (data_type == RECT_AREA) {
area_sum += rect_area[ind]; } else {
rect_length_sum += rect[ind].length; rect_width_sum += rect[ind].width; } }
因为判断语句与循环变量无关,故可如下改进,以减少判断次数。 if (data_type == RECT_AREA) {
for (ind = 0; ind < MAX_RECT_NUMBER; ind++) {
area_sum += rect_area[ind]; } } else {
for (ind = 0; ind < MAX_RECT_NUMBER; ind++)
软件编程规范
{
rect_length_sum += rect[ind].length; rect_width_sum += rect[ind].width; } }
建议7-4:在逻辑清楚且不影响可读性的情况下,代码越少越好
说明:写程序不是以行数的多少来判断一个人的工作效率,代码不是越多越好。
规则7-4:尽量使用标准库函数,不要“发明”已经存在的库函数“
建议7-5:要尽量重用已有的代码,直接调用已有的API
说明:如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写。
软件编程规范
第八章质量保证
规则8-1:只引用属于自己的存贮空间。
说明:若模块封装的较好,那么一般不会发生非法引用他人的空间。 规则8-2:防止引用已经释放的内存空间。
说明:在实际编程过程中,稍不留心就会出现在一个模块中释放了某个内存块(如C语言指针),而另一模块在随后的某个时刻又使用了它。
规则8-3:过程/函数中动态分配的资源(包括内存、文件等),在过程/函数退出之前要释放。 示例:以下例子将造成内存泄露 :
void Func(void) {
char *p = (char *) malloc(128); ?? //do something return ; }
建议8-1:充分理解new/delete,malloc/free 等指针相关的函数的意义,对指针操作时需小心翼翼
示例:
1. 内存被释放了,并不表示指针会消亡或者成了NULL指针
char *p = (char *) malloc(100); strcpy(p, “hello”); free(p); …… //do something
if (p != NULL) {
软件编程规范
?? //These code will be executed ? }
p 没有成为NULL 指针,if 中间的代码被错误执行了。
2. new 与delete 要“步调一致”
void Func() {
Object *pObjects=new Object[10] ; ?? // do something delete pObjects ; }
申请了10 个Object空间,但只释放了1 个,造成内存泄露。正确的写法是: delete []pObjects ;
规则8-4:防止内存操作越界。
说明:内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主要错误之一,后果往往非常严重,所以当我们进行这些操作时一定要仔细小心。
示例:假设某软件系统最多可由10个用户同时使用,用户号为1-10,那么如下程序存在问题。
#define MAX_USR_NUM 10
unsigned char usr_login_flg[MAX_USR_NUM]= \
void set_usr_login_flg( unsigned char usr_no ) {
if (!usr_login_flg[usr_no]) {
usr_login_flg[usr_no]= TRUE; } }
当usr_no为10时,将使用usr_login_flg越界。可采用如下方式解决。 void set_usr_login_flg( unsigned char usr_no )
软件编程规范
{
if (!usr_login_flg[usr_no - 1]) {
usr_login_flg[usr_no - 1]= TRUE; } }
建议8-1:要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,以防止拼写错误。
说明:形式相近的操作符最容易引起误用,如C/C++中的“=”与“==”、“|”与“||”、“&”与“&&”等,若拼写错了,编译器不一定能够检查出来。
示例:如把“&”写成“&&”,或反之。
ret_flg = (pmsg->ret_flg & RETURN_MASK); 被写为:
ret_flg = (pmsg->ret_flg && RETURN_MASK);
rpt_flg = (VALID_TASK_NO( taskno ) && DATA_NOT_ZERO( stat_data )); 被写为:
rpt_flg = (VALID_TASK_NO( taskno ) & DATA_NOT_ZERO( stat_data ));
建议8-2:条件表达式要把常量写在前面
说明:习惯写 if (MAX_COUNT == nIndex) 就不会发生 if (nIndex = MAX_COUNT)的错误。
建议8-3:有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待;switch语句必须有default分支。 规则8-2:尽量少用goto语句。 说明:
1. goto语句会破坏程序的结构性,所以除非确实需要,最好不使用goto语句。 2. 使用goto 语句时,不能往回跳 3. 尽量不要用多于一个的goto语句标记
规则8-3:不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的