关闭

关闭

关闭

封号提示

内容

首页 软件编程规范.doc

软件编程规范.doc

软件编程规范.doc

上传者: 寻觅 2010-06-25 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《软件编程规范doc》,可适用于IT/计算机领域,主题内容包含软件编程规范北京和利时系统工程股份有限公司技术文件文件名称:秦山一期KITPROC软件编程规范文件编号:项目名称:秦山一期电站计算机系统改造软件项目符等。

软件编程规范北京和利时系统工程股份有限公司技术文件文件名称:秦山一期KITPROC软件编程规范文件编号:项目名称:秦山一期电站计算机系统改造软件项目编号:D物料编码:受控标识:第册共页共册版本状态拟制审核批准批准日期修订信息A牛玉贞相关部门会签:文件发放部门主送阅知部门主送阅知软件开发部ERP事业部硬件开发部交通信息系统事业部技术管理部国际贸易部系统开发部质量部核电项目部计划财务部生产管理部证券部采购供应部办公室营销部人力资源部工业自动化事业部信息管理部系统集成事业部后勤管理部引言目的范围规范文件版面风格标识符命名函数与宏代码的可靠性引言目的本规范的目的在于增加源代码的可读性减少程序员对代码理解上的偏差使程序员能够编写出可靠的代码降低代码维护成本。范围本规范内容涉及范围包括:文件、版面、注释、标识符、变量和结构、函数、宏以及可理解性等。本规范适用于公司开发的所有软件产品。在新软件的编码过程中本规范必须执行。规范文件头文件的名称一律为小写格式为“子系统名文件名h”。例如:ipfprotocolh等。头文件的格式如下:注释头格式参见下面的例子头文件预编译开关开始格式为:#ifndef预编译开关#define预编译开关其中预编译开关格式为:“文件名H”其中文件名一律大写头文件内容头文件预编译开关结束格式为:#endif用来和头文件预编译开关的开始对应。例如:以下为ipfiph头文件的内容:************************************************************Copyright(c)BeijingHollysysCo,LtdALLRIGHTSRESERVEDDescription:用于详细说明此程序文件完成的主要功能*************************************************************#ifndefIPFIPH#defineIPFIPH<头文件正文>#endif头文件的定义要有层次禁止交叉引用。说明:头文件的层次设置为公共模块、私有模块。头文件的引用次序为下层头文件引用上层头文件、私有头文件引用公共头文件声明结构时尤其要注意不允许出现交叉引用的情况。示例:如下定义不符合规范头文件isdnah************************************************************Copyright(c)BeijingHollysysCo,LtdALLRIGHTSRESERVEDDescription:定义配置数据结构************************************************************#ifndefISDNAH#defineISDNAH#include“isdnbh”typedefstruct{ISDNCONTROLstIsdnControl}ISDNCONFIG#endif头文件isdnbh************************************************************Copyright(c)BeijingHollysysCo,LtdALLRIGHTSRESERVEDDescription:定义控制数据结构*************************************************************#ifndefISDNBH#defineISDNBH#include“isdnah”typedefstruct{ISDNCONFIGstIsdnConfig}ISDNCONTROL#endif为了解决上述矛盾可以将两个结构合并到一个文件中声明。文件中如果引用系统头文件必须使用“<“和“>“如果引用自定义的头文件必须使用“”“和“”“。说明:系统头文件是指由编译系统提供的头文件。示例:如下书写不符合规范。#include“stdlibh”#include<isdnconfigh>应该改作:#include<stdlibh>#include“isdnconfigh”头文件中只能声明变量类型禁止定义变量。说明:如果在头文件中定义变量当有多个源文件引用该头文件时会出现重复定义的错误。示例:如下头文件是不规范的。头文件isdnah************************************************************Copyright(c)BeijingHollysysCo,LtdALLRIGHTSRESERVEDDescription:定义配置数据结构*************************************************************#ifndefISDNAH#defineISDNAHtypedefstruct{}ISDNCONFIGISDNCONFIGgstIsdnConfig#endif结构变量gstIsdnConfig不能在头文件中定义只能在源文件中定义。可以在相应的源文件定义后头文件作如下改动:ISDNCONFIGgstIsdnConfig改为externISDNCONFIGgstIsdnConfig头文件的声明顺序应该有层次感。说明:头文件的声明顺序一般是宏、结构、函数、变量。函数在头文件中声明时开头可以不加“extern”源文件名称一律小写格式为:子系统名文件名c示例:ipfpktc表示在IPF子系统的包处理文件。源文件必须加注释头。源文件注释头格式为:************************************************************Copyright(c)BeijingHollysysCo,LtdALLRIGHTSRESERVEDDescription:用于详细说明此程序文件完成的主要功能*************************************************************版面风格程序块采用缩进风格编写缩进规定为个空格(建议不使用TAB符号因为各个系统TAB符号的空格数不一样)。变量说明之后必须加空行。说明:由开发工具自动生成的代码例外。示例:如下例子不符合规范。voidisdnInitConfig(void){WORDwConfigNumnerprogramcode}应如下书写voidisdnInitConfig(void){WORDwConfigNumnerprogramcode}不允许把多个短语句写在一行中一行只写一条语句。示例:如下例子不符合规范。wLength=wWidth=或wLength=,wWidth=应如下书写wLength=wWidth=禁止如下写法:inti=j=或inti=,j=应该写作:inti=intj=或inti,ji=j=do、while、switch、case、default、if、else、for等语句自占一行且if、else语句在同一列。示例:如下例子不符合规范。do{programcode}while(pstUser!=)应如下书写:do{programcode}while(pstUser!=)示例:如下例子不符合规范。while(pstUser!=){programcode}应如下书写:while(pstUser!=){programcode}示例:如下例子不符合规范。switch(dwCounter){case:dwCounterprogramcodebreakdefault:break}应如下书写:switch(dwCounter){case:dwCounterprogramcodebreakdefault:break}示例:如下例子不符合规范。if(pstUser==)returnelse{programcode}应如下书写:if(pstUser==){return}else{programcode}示例:如下例子不符合规范。for(i=i<i){programcode}应如下书写:for(i=i<i){programcode}函数的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。示例:如下例子不符合规范。intisdnConfig(void){programcodereturn}应该改为intisdnConfig(void){programcodereturn}示例:如下例子不符合规范。typedefstruct{WORDwSlotWORDwPort}ISDNCONFIG应该改为typedefstruct{WORDwSlotWORDwPort}ISDNCONFIG在switch的处理程序块中case和default语句下的处理语句也要遵从语句缩进要求。示例:以下写法是不规范的switch(wEvent){case:programcodebreak}应该改为:switch(wEvent){case:programcodebreakdefault:break}程序块的分界符(大括号'{'和'}')应各独占一行并且位于同一列同时与引用它们的语句左对齐。示例:如下例子不符合规范。if(){programcode}voidisdnExampleFun(void){programcode}应如下书写。if(){programcode}voidisdnExampleFun(void){programcode}函数头部应进行注释列出:函数的名称、功能、输入参数、输出参数、返回值等。示例:编写函数时候按照下面这段注释编写。*************************************************FuncName:函数名称Description:函数功能的描述Input:输入参数说明Output:对输出参数和函数返回值的说明*************************************************注释应与其描述的代码相近对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置不可放在下面。示例:如下例子不符合规范。isdnInit()初始化ISDN任务应如下书写:初始化ISDN任务isdnInit()对有实际含义的变量或者常量的注释应放在其上方相邻位置或右方。对宏的注释应放在上面不可放在其右方或下方。对数据结构的声明(包括数组、结构、类、枚举等)注释应放在其上方相邻位置不可放在下面对结构中的每个域的注释放在此域的右方。示例:以下写法不规范#defineVOSERRORMSGON错误信息打印输出开关应改为错误信息打印输出开关#defineVOSERRORMSGON允许使用””进行注释示例:以下注释是允许的根据CFM所存的配置信息更新接口配置信息voidisdnSetConfigData(void){programcode}标识符命名局部变量采用大小写混排的匈牙利方式命名命名格式为前缀变量名称其中变量名由一个或一个以上的单词组成每个单词首字母大写其余一律小写。说明:前缀要表明变量类型。下表为定义变量时候使用的前缀。类型前缀类型名称BOOLEANb布尔型BYTEby无符号字符型WORDw无符号短整型DWORDdw无符号长整型charc字符型shorts短整型inti整型longl长整型st结构类型un联合类型p指针pbyBYTE的指针pwWORD的指针pdwDWORD的指针pst结构的指针pun联合的指针pa数组的指针pfn函数指针pm消息的指针pc字符型的指针ps短整型的指针pi整型的指针pl长整型的指针pp(根据类型添加其他前缀)指针的指针a数组abyBYTE数组awWORD数组adwDWORD数组ast结构数组aun联合数组afn函数数组ac字符型数组as短整型数组ai整型数组al长整型数组sz以结尾的字符串型示例:以下的书写不规范WORDslotBYTE*byAccessDWORDarpframecount应该写作:WORDwSlotBYTE*pbyAccessDWORDdwArpFrameCount普通宏的定义使用全大写字母加下划线的方式结构为:子系统下划线宏内容名称。示例:#defineIPMAXHWALEN#defineIPVER(x)((x>>)xF)函数的命名为:前缀下划线字符串。其中前缀为全小写的子系统名称字符串由一个或多个单词组成每个单词首字母大写其他字母小写。示例:voidvosMsgCreate(void)voidicmpPktRecv(void)调试用的编译开关是开头为下划线的全大写字符串具体格式是:下划线DEBUG子系统名称下划线名称。示例:DEBUGIPFIPPACKET、DEBUGTCPOPTION等。结构联合类型命名规则为:子系统名称下划线结构名称、子系统名称下划线联合名称其中所有字母大写。示例:typedefstruct{}IPTRACEROUTEtypedefunion{}ICMPPKT全局变量命名的具体格式是:前缀下划线子系统名下划线字符串其中前缀为小写的“g”子系统名称全部小写字符串由一个或多个单词组成每个单词首字母大写其他字母小写。示例:gicmpTraceRouteQueue、gospfInterfList等。消息宏定义采用以下格式:前缀下划线字符串下划线后缀。其中前缀采用小写的“mm”字符串标记消息宏的具体含义由一个或多个单词组成每个单词首字母大写其他字母小写后缀为XXXtoYYY表示消息的传送方向XXX表示源子系统名YYY为目的子系统名全部用大写字母表示。示例:mmAddRouteBGPtoRTMGT表示从BGP协议发送到路由管理实体的增加一条路由的消息mmShowIpRouteCLItoRTMGT表示从CLI发送到路由管理子系统的要求显示路由表的消息。函数与宏对函数的返回值要仔细、全面地处理。说明:对提供返回值的函数尤其是接口函数其返回值必须检查。示例:以下函数是不规范的。voidisdnSendMessage(void){programcodevosMsgPost()发送消息}应该改作voidisdnSendMessage(void){INTiPostprogramcodeiPost=vosMsgPost()发送消息if(iPost==VOSOK){处理代码}else{处理代码}}接口函数的输入参数(尤其是指针和数组下标)、非输入参数的合法性必须检查。说明:函数的输入主要有两种:一种是参数输入另一种是非参数输入包括全局变量、数据文件等这些参数都需要作检查。示例:下面函数的实现不符合规范。RESULTisdnReceive(NICELL*pstCell,SKBUF*pstSkBuf){接收数据代码returnOK}应改作以下写法。RESULTisdnReceive(NICELL*pstCell,SKBUF*pstSkBuf){if((pstCell==)||(pstSkBuf==)){returnFALSE}接收数据代码returnOK}禁止把函数的参数作为工作变量说明:需要做改变的参数应该先用局部变量代之最后再将该局部变量的内容赋给该参数。示例:下面函数的实现不符合规范。BOOLEANisdnSumData(WORDwNumber,WORD*pwData,WORD*pwSum){WORDwCountif((pwData==)||(pwSum==)){returnFALSE}*pwSum=for(wCount=wCount<wNumberwCount){*pwSum=pwDatawCountpwSum成了工作变量不规范}returnTRUE}应改作以下写法。BOOLEANisdnSumData(WORDwNumber,WORD*pwData,WORD*pwSum){WORDwCountWORDwSumTempif((pwData==)||(pwSum==)){returnFALSE}wSumTemp=for(wCount=wCount<wNumberwCount){wSumTemp=pwDatawCount}*pwSum=wSumTempreturnTRUE}明确函数的返回值当函数不需要返回值时要定义为void。示例:如下函数写作不规范isdnInitCtrlBlock(void){programcode}应改作:voidisdnInitCtrlBlock(void){programcode}用宏定义表达式时要使用完备的括号。示例:如下定义的宏都存在一定的风险不符合规范。#defineMAX(a,b)a>ba:b#defineMAX(a,b)(a>ba:b)#defineMAX(a,b)(a)>(b)(a):(b)正确的定义应为:#defineMAX(a,b)((a)>(b)(a):(b))使用宏时不允许参数发生变化。示例:如下用法导致错误。#defineMAX(a,b)((a)>(b)(a):(b))iResult=MAX(iRx,iTx)将被预处理器解释为iResult=((iRx)>(iTx)(iRx):(iTx))此时如果输入iRx=iTx=代码执行结果iResult=此时iRx为。应该改作如下用法:iResult=MAX(iRx,iTx)iRx代码的可靠性系统运行之初要初始化所有本系统的全局变量禁止未经初始化的全局变量被引用。说明:使用未初始化的数据容易使系统进入混乱状态。示例:以下的全局变量如果没有在系统运行时初始化在被函数使用时会出错ISDNCELL*gpstIsdnCellISDNMAXCELLNUMvoidisdnShowChannel(WORDwSlot,WORDwPort){ISDNCELL*pstIsdnCell=intifor(i=i<ISDNMAXCELLNUMi){if(gstpIsdnCelli!=){pstIsdnCell=gpstIsdnCelli如果gpstIsdnCell没有初始化为空以下语句会出错if((pstIsdnCell>wSlot==wSlot)(pstIsdnCell>wPort==wPort))break}}otherprogramcode}申请内存之后应该立即检查指针值是否为?(防止使用指针值为的内存)说明:申请内存时如果申请失败应该避免使用该指针。必须使用if(p==)或if(p!=)进行防错处理。禁止将未被初始化的内存作为零值使用。说明:创建的数组或动态申请的内存其初始值是不确定的不能当作零处理。示例:以下代码是不规范的。voidisdnCheckIe(BYTE*pbyIe,WORDwIeLen){WORDwTempLenwTempLen未初始化其初始值不一定为while(wTempLen<wIeLen){otherprogramcodewTempLen=}}应作如下改写:voidisdnCheckIe(BYTE*pbyIe,WORDwIeLen){WORDwTempLenwTempLen=while(wTempLen<wIeLen){otherprogramcodewTempLen=}}动态内存的申请与释放要配对防止内存泄漏。说明:内存泄漏问题要高度重视。内存泄漏会引起系统死机或崩溃一般在系统启动很长一段时间后才发作不易察觉一般的测试手段也检测不到。在switch的处理程序块中必须有default语句并且每个case语句都要有对应的break。说明:如果一个case下的处理语句需要调用下一个case的处理语句可以将下一个case的处理语句copy过来。示例:以下写法是不规范的switch(wEvent){case:isdnSendEvent(wEvent)case:wEventbreakdefault:break}应该改为:switch(wEvent){case:isdnSendEvent(wEvent)wEventbreakcase:wEventbreakdefault:break}不要滥用goto语句。说明:goto语句会破坏程序的结构性除非确实需要不要使用goto语句。使用显式的数据类型转换避免让编译器进行隐式的数据类型转换。说明:使用显示的数据转换一方面增加可读性有利于代码的维护另一方面避免隐式的数据类型转换引起的编译告警。示例:以下的书写不符合规范NICELL*isdnLoad(void){NICELL*pstNiCellpstNiCell=vosmalloc(sizeof(NICELL))programcodereturnpstNiCell}应改作:NICELL*isdnLoad(void){NICELL*pstNiCellpstNiCell=(NICELL*)vosmalloc(sizeof(NICELL))programcodereturnpstNiCell}不要使用难懂的技巧性很高的语句。说明:高技巧语句不等于高效率的程序实际上程序的效率关键在于算法。示例:如下表达式考虑不周就可能出问题也较难理解。*pbyState=*pbyState=应分别改为如下。*pbyState=pbyState此二语句功能相当于"*pbyState="pbyState*pbyState=此二语句功能相当于"*pbyState="第页共页doc

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/21
2下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部