文档编号产品版本受控状态DC-SB-2003-1005V1.0内部产品名称:软件编程规范共页软件编程规范(仅供内部使用)北京世纪百合科技有限公司BeijingCenturialLilyTechnologyCo.,Ltd.版权所有不得复制文档修改记录版本号日期所改页注记提交人批准人目录1.引言........................................................1.1目的.................................................................41.2范围..................................................................2.规范........................................................2.1文件..................................................................2.2版面风格.............................................................2.3标识符命名............................................................2.4函数与宏..............................................................2.5代码的可靠性.........................................错误!未定义书签。3.附录:通用类型的公共定义....................................1.引言1.1目的本规范的目的在于增加源代码的可读性,减少程序员对代码理解上的偏差,使程序员能够编写出可靠的代码,降低代码维护成本。1.2范围本规范内容涉及范围包括:文件、版面、注释、标识符、变量和结构、函数、宏以及可理解性等。本规范适用于公司开发的所有软件产品。在新软件的编码过程中本规范必须执行。2.规范2.1文件2.1.1头文件的名称一律为小写,格式为“子系统名_文件名.h”。例如:ipf_protocol.h等。2.1.2头文件的格式如下:注释头,格式参见软件编程规范;头文件预编译开关开始,格式为:#ifndef预编译开关#define预编译开关其中预编译开关格式为:“_文件名_H”,其中文件名一律大写头文件内容;头文件预编译开关结束,格式为:#endif用来和头文件预编译开关的开始对应。例如:以下为ipf_ip.h头文件的内容:/************************************************************Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.ALLRIGHTSRESERVEDDescription://用于详细说明此程序文件完成的主要功能*************************************************************/#ifndef_IPF_IP_H#define_IPF_IP_H...头文件正文...#endif2.1.3头文件的定义要有层次,禁止交叉引用。说明:头文件的层次设置为公共模块、私有模块。头文件的引用次序为下层头文件引用上层头文件、私有头文件引用公共头文件,声明结构时尤其要注意,不允许出现交叉引用的情况。示例:如下定义不符合规范头文件isdn_a.h/************************************************************Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.ALLRIGHTSRESERVEDDescription:定义配置数据结构************************************************************/#ifndef_ISDN_A_H#define_ISDN_A_H#include“isdn_b.h”typedefstruct{...;ISDN_CONTROLstIsdnControl;...;}ISDN_CONFIG;#endif头文件isdn_b.h/************************************************************Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.ALLRIGHTSRESERVEDDescription:定义控制数据结构*************************************************************/#ifndef_ISDN_B_H#define_ISDN_B_H#include“isdn_a.h”typedefstruct{...;ISDN_CONFIGstIsdnConfig;...;}ISDN_CONTROL;#endif为了解决上述矛盾,可以将两个结构合并到一个文件中声明。2.1.4文件中如果引用系统头文件,必须使用““和““;如果引用自定义的头文件,必须使用“”“和“”“。说明:系统头文件是指由编译系统提供的头文件。示例:如下书写不符合规范。#include“stdlib.h”#includeisdn_config.h应该改作:#includestdlib.h#include“isdn_config.h”2.1.5头文件中只能声明变量类型,禁止定义变量。说明:如果在头文件中定义变量,当有多个源文件引用该头文件时,会出现重复定义的错误。示例:如下头文件是不规范的。头文件isdn_a.h/************************************************************Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.ALLRIGHTSRESERVEDDescription:定义配置数据结构*************************************************************/#ifndef_ISDN_A_H#define_ISDN_A_Htypedefstruct{...;}ISDN_CONFIG;ISDN_CONFIGg_stIsdnConfig;#endif结构变量g_stIsdnConfig不能在头文件中定义,只能在源文件中定义。可以在相应的源文件定义后,头文件作如下改动:ISDN_CONFIGg_stIsdnConfig;改为externISDN_CONFIGg_stIsdnConfig;2.1.6头文件的声明顺序,应该有层次感。说明:头文件的声明顺序一般是宏、结构、函数、变量。函数在头文件中声明时开头可以不加“extern”2.1.7源文件名称一律小写,格式为:子系统名_文件名.c,示例:ipf_pkt.c表示在IPF子系统的包处理文件。2.1.8源文件必须加注释头。源文件注释头格式为:/************************************************************Copyright(c)LilyOfTheCenturyTechnologyCo.,LTD.ALLRIGHTSRESERVEDDescription://用于详细说明此程序文件完成的主要功能*************************************************************/2.2版面风格2.2.1程序块采用缩进风格编写,缩进使用TAB符号,TAB符号规定为4个空格。变量说明之后必须加空行。说明:由开发工具自动生成的代码例外。示例:如下例子不符合规范。voidisdn_InitConfig(void){WORDwConfigNumner;...;//programcode}应如下书写voidisdn_InitConfig(void){WORDwConfigNumner;...;//programcode}2.2.2不允许把多个短语句写在一行中,一行只写一条语句。示例:如下例子不符合规范。wLength=wWidth=0;或wLength=0,wWidth=0;应如下书写wLength=0;wWidth=0;禁止如下写法:inti=j=0;或inti=0,j=0;应该写作:inti=0;intj=0;或inti,j;i=0;j=0;2.2.3do、while、switch、case、default、if、else、for等语句自占一行,且if、else语句在同一列。示例1:如下例子不符合规范。do{...;//programcode}while(pstUser!=NULL);应如下书写:do{...;//programcode}while(pstUser!=NULL);示例2:如下例子不符合规范。while(pstUser!=NULL){...;//programcode}应如下书写:while(pstUser!=NULL){...;//programcode}示例3:如下例子不符合规范。switch(dwCounter){case1:dwCounter++;...;//programcodebreak;default:break;}应如下书写:switch(dwCounter){case1:dwCounter++;...;//programcodebreak;default:break;}示例4:如下例子不符合规范。if(pstUser==NULL)return;else{...;//programcode}应如下书写:if(pstUser==NULL){return;}else{...;//programcode}示例5:如下例子不符合规范。for(i=0;i10;i++){...;//programcode}应如下书写:for(i=0;i10;i++){...;//programcode}2.2.4函数的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。示例:如下例子不符合规范。intisdn_Config(void){...;//programcodereturn0;}应该改为intisdn_Config(void){...;//programcodereturn0;}示例:如下例子不符合规范。typedefstruct{WORDwSlot;WORDwPort;}ISDN_CONFIG;应该改为typedefstruct{WORDwSlot;WORDwPort;}ISDN_CONFIG;2.2.5在switch的处理程序块中,case和default语句下的处理语句也要遵从语句缩进要求。示例:以下写法是不规范的switch(wEvent){case1:...;//programcodebreak;}应该改为:switch(wEvent){case1:...;//programcodebreak;default:break;}2.2.6程序块的分界符(大括号'{'和'}')应各独占一行并且位于同一列,同时与引用它们的语句左对齐。示例:如下例子不符合规范。if(...){...//programcode}voidisdn_ExampleFun(void){...//programcode}应如下书写。if(...){...//programcode}voidisdn_ExampleFun(void){...;//programcode}2.2.7函数头部应进行注释,列出:函数的名称、功能