软件编程规范总则深圳市华为技术有限公司版权所有不得复制软件编程规范总则仅供内部使用2修订记录日期修订版本描述作者1999/01/201.00初稿完成1999/01/221.01重新编排;增加建议1-3、规则2-14、建议2-5、规则3-4;修改建议6-2、规则4-3、规则5-6;分别将原规则5-6、规则6-1、建议7-4改为建议5-16、建议6-1、规则7-14。1999/01/251.02将规范中代码书写风格与规范本身统一。1999/01/271.03取消建议1-3:简单情况处理case语句的特殊编排方法。取消规则1-8:结构成员赋值等情况等号对齐。修改规则1-8只能用空格键为空格键与TAB不许混用。修改规则1-9中采用缩进风格:取消说明文字,加上CASE语句的规定。修改规则1-11操作符加空格的说明及增加对if、while的要求。修改建议2-5注释格式尽量统一中“/**/”和“//”格式增加规则2-16。1999/01/301.04修改规则3-4:允许i、j、k作循环变量;将规则4-3不使用难懂的技巧很高的语句改为建议4-2;修改建议6-6,增加对函数返回值是指针的情况建议;增加建议6-28:函数与过程中避免使用BOOL参数;修改规则2-2,要求头文件中必须有主要函数的功能说明1999/02/011.05修改规则2-10,取消有关“同一结构不同域的注释要对齐”的内容;增加规则3-5:命名不要采用大小写与下划线混排方式;修改建议6-13,加入OOP方法的函数命名建议;修改建议7-4为规则7-15,要求DEBUG版与RELEASE版统一维护;修改规则2-14为建议2-6,建议注释使用中文;增加规则9-16:if语句加上else分支,switch语句加上default分支;增加建议6-29:调用函数时使用其返回值修改规则1-1,增加说明,对开发工具自动生成的代码缩进空格以自动生成的为准修改建议5-16,考虑字节对齐的问题删除建议5-10声明变量的同时对变量进行初始化,原因是很多软件可以查出这种情况,强制初始化反而不妥,如全局变量在声明时初始化的情况。1999/02/021.06加入有关宏的三条规则。修改建议2-4:在程序块的结束行右方加注释标记。增加建议3-5:除特殊应用外避免下划线开始和结尾的定义。修改建议5-15的示例,推荐以后使用BYTE、WORD数据类型等的自定义方式,而不是原来的_UC、_US方式。统一修改示例。软件编程规范总则仅供内部使用3修改建议9-2,避免嵌入式汇编。增加建议9-13:如果资源对语言敏感,将资源文件与源代码文件脱离。软件编程规范总则仅供内部使用4目录1排版52注释103标识符命名174可读性195变量216函数、过程287可测性368程序效率419质量保证4510代码编辑、编译、审查5211代码测试、维护5412宏55软件编程规范总则仅供内部使用5软件编程规范总则研究管理部技术管理处为了提高源程序的质量和可维护性,最终提高公司软件产品生产力,我们有必要对公司软件产品的源程序的编写风格作出统一的规范约束。本规范总则是独立于具体语言的编程规则的总的原则,针对不同编程语言或应用环境的编程规范在遵守本规范总则的基础上,还必须遵守相应语言和就用环境的编程规范。本规范总则适用于公司所有产品以及对外合作委托开发产品的软件源程序。本规范总则的内容包括:排版、注释、标识符命名、变量使用、代码可测性、程序效率、质量保证、代码编译、单元测试、程序版本与维护等。本规范总则的示例都以C语言为背景,采用以下的术语描述:★规则:编程时强制必须遵守的原则。★建议:编程时必须加以考虑的原则。★说明:对此规则或建议进行必要的解释。★示例:对此规则或建议从正、反两个方面给出例子。本规范参照《交换业务部编程规范(试行)》、《无线业务部软件编程规范(第三版)》制定,根据各部门意见修改完成。本规范在1999年2月4日前由各业务部会签后颁布执行。研究技术管理处软件工程室将会同各业务部一起定期对规范的执行情况进行检查,对违规行为进行警告、通报批评、罚款100-500元等方式的处罚。要求所有的新软件源程序必须按照规范要求编写,对于已有软件的源程序要求必须调动资源按照规范对源程序进行修改,要求在每次检查时源程序风格都应有进步,在1999年9月30日前,所有产品的源程序都必须符合本规范规定。软件编程规范总则1排版仅供内部使用61排版¹æÔò1-1:程序块要采用缩进风格编写,缩进的空格数为4个。说明:对于由开发工具自动生成的代码可以有不一致。¹æÔò1-2:相对独立的程序块之间、变量说明之后必须加空行。示例:如下例子不符合规范。if(!valid_ni(ni)){...//programcode}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;应如下书写if(!valid_ni(ni)){...//programcode}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;¹æÔò1-3:较长的语句(80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。示例:perm_count_msg.head.len=NO7_TO_STAT_PERM_COUNT_LEN+STAT_SIZE_PER_FRAM*sizeof(_UL);act_task_table[frame_id*STAT_TASK_CHECK_NUMBER+index].occupied=stat_poi[index].occupied;软件编程规范总则1排版仅供内部使用7act_task_table[taskno].duration_true_or_false=SYS_get_sccp_statistic_state(stat_item);report_or_not_flag=((tasknoMAX_ACT_TASK_NUMBER)&&(n7stat_stat_item_valid(stat_item))&&(act_task_table[taskno].result_data!=0));¹æÔò1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。示例:if((tasknomax_act_task_number)&&(n7stat_stat_item_valid(stat_item))){...//programcode}for(i=0;j=0;(iBufferKeyword[word_index].word_length)&&(jNewKeyword.word_length);i++;j++){...//programcode}for(i=0;j=0;(ifirst_word_length)&&(jsecond_word_length);i++;j++){...//programcode}¹æÔò1-5:若函数或过程中的参数较长,则要进行适当的划分。示例:n7stat_str_compare((BYTE*)&stat_object,软件编程规范总则1排版仅供内部使用8(BYTE*)&(act_task_table[taskno].stat_object),sizeof(_STAT_OBJECT));n7stat_flash_act_duration(stat_item,frame_id*STAT_TASK_CHECK_NUMBER+index,stat_object);¹æÔò1-6:不允许把多个短语句写在一行中,即一行只写一条语句。示例:如下例子不符合规范。rect.length=0;rect.width=0;应如下书写rect.length=0;rect.width=0;¹æÔò1-7:if、while、for、default、do等语句自占一行。示例:如下例子不符合规范。if(pUserCR==NULL)return;应如下书写:if(pUserCR==NULL)return;¹æÔò1-8:不要混合使用空格键和TAB键。说明:只要不混用,用不同的编辑器阅读程序时,不会因TAB键所设置的空格数目不同而造成程序布局不整齐。软件编程规范总则1排版仅供内部使用9¹æÔò1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。¹æÔò1-10:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。示例:如下例子不符合规范。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}应如下书写。for(...){...//programcode}if(...){...//programcode}软件编程规范总则1排版仅供内部使用10voidexample_fun(void){...//programcode}¹æÔò1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如-),后不应加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如括号内侧(即左括号后面和右括号前面)不要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。示例:(1)逗号、分号只在后面加空格inta,b,c;(2)比较操作符,赋值操作符=、+=,算术操作符+、%,逻辑操作符&&、&,位域操作符、^等双目操作符的前后加空格if(current_time=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;(3)!、~、++、--、&(地址运算符)等单目操作符前后不加空格*p='a';//内容操作*与内容之间flag=!isEmpty;//非操作!与内容之间p=&mem;//地址操作&与内容之间软件编程规范总则1排版仅供内部使用11i++;//++,--与内容之间(4)-、.前后不加空格p-id=pid;//-指针前后不加空格(5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。if(a=b&&cd)½¨Òé1-1:一行程序以小于80字符为宜,不要写得过长。½¨Òé1-2:不同类型的操作符混合使用时,即使实现优先级与实际需要相符,最好也使用括号隔离之,以便代码更加清晰。示例:如本来是正确的代码:if(year%4==0||year%100!=0&&year%400==0)如果加上括号,则更清晰。If((year%4)==0||(year%100)!=0&&(year%400)==0)软件编程规范总则2注释仅供内部使用122注释¹æÔò2-1:一般情况下,源程序有效注释量必须在20%以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。¹æÔò2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改