软件编程规范(forC).pdf
《软件编程规范(forC).pdf》由会员分享,可在线阅读,更多相关《软件编程规范(forC).pdf(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Q/ZX 深圳市中兴通讯股份有限公司企业标准(标准类别)Q/ZX B XXX 20032003-07-21 发布2003-07-21实施深圳市中兴通讯股份有限公司网络事业部发布软件编程规范(for C)Q/ZX B XXX 2003 I目次前言.II1范围.12术语和定义.13基本原则.24命名规则.35常用数据及变量要求.56程序语句要求.77布局要求.118注释要求.159断言和错误处理.1810测试代码要求.1911动态内存分配.20Q/ZX B XXX 2003 第 II 页 共 36 页前言本标准根据中兴通讯网络事业部研究所(南京和上海)实际情况并参考有关规定编写,本文规范了研究所软
2、件开发过程中编码的规范性要求。编码规范是指对软件代码的规划、编写、注释、检查、测试等步骤的提出的符合一定规范的要求,目的是为了提高研究所软件开发的质量和工程化水平。本标准由网络事业部质量部提出并归口。本标准由研究所(南京)测试部、研究所(上海)软件开发三部、研究所(上海)软件开发四部起草,主要起草人:樊晓兵、田小渝本标准于 2003 年 7 月首次发布。Q/ZX B XXX 2003 第 1 页 共 36 页软件编程规范(for C)1范围本标准适用于深圳市中兴通讯股份有限公司网络事业部研究所(南京、上海)进行新产品的软件设计、开发工作。2术语和定义本规范按照以下术语进行描述:规则:编程时必须
3、遵守的原则;建议:编程时必须重点考虑的原则;说明:对上述规则或建议的解释;正例:对上述规则或建议给出的正面的例子;反例:对上述规则或建议给出的反面的例子。标准化:为保证产品的先进性、稳定性、可生产性,我们必须遵循一定的研发流程及设计规范,解决产品设计过程中的品种控制、可用性、兼容性和互换性等问题,减少成本、提高产品质量。模块化:是为了获得最佳效益,从系统观点出发,研究产品的构成形式,用分解和组合方法,建立模块体系,并运用模块组合产品的过程。模块化的表现形式是组合化,模块化是实现产品设计继承性和互换性、产品兼容性和多样性的必要条件。工程化:根据系统工程的思想,按顾客需求,在充分的市场调研、论证的
4、基础上,以采用成熟、经济、实用的技术为主,结合具有一定把握的预研成果组织市场、设计、工艺、生产及服务等人员按并行工程的思想组织研发,将功能、可靠性、可生产性及成本设计到产品中去,并根据内外反馈的质量信息,持续改进,不断地超越竞争对手,在同业中达到与保持领先地位。鲁棒性:鲁棒性是与系统稳定性相联系的一个性质。它是指控制系统在其特性或参数发生摄动时仍可使品质指标保持不变的性能。可靠性:有关出错保障能力、健壮性、内部信息的一致性、错误识别能力、错误处理能力以及系统对噪声的敏感性等非功能性指标。结构化:结构化 程序是通过把程序的主要功能分开然后变成程序中函数的基本片段来建立的。通过孤立函数中的过程,结
5、构化 程序使一个过程可以影响另一个的机会最少。这也使得容易隔离问题。分隔使你可以编写更加清楚的代码并维持对每一个函数的控制。全局变量消失,代之以具有较小的、更容易控制的范围的参数和局郡变量。可重用性:要求软件的模块或成份应是结构化和参数化的,并按某种适当方式存档,以便模块或成份可以达到重用的目的,从而相对减少了实际工作的复杂性和软件的规模。封装性:封装性的概念来自于面向对象的程序设计,封装意味着操作可见而将数据和操作的实现方法隐藏在所定义的对象中。内聚性:指的是在一个子程序中,各种操作之间互相联系的紧密程度。耦合度:是模块间联系强弱的度量。聚合度:是模块所执行任务的整体统一性的度量。可移植性:
6、是软件在不同的操作环境下能够运行的程度。Q/ZX B XXX 2003 第 2 页 共 36 页3基本原则首先为人编写程序,其次才是计算机。说明:这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、版本升级和后期维护等长期过程,只有易读、易维护的软件代码才是有生命力的。程序代码应该简明清晰和显式地表达意图。说明:不要玩弄技巧。过分完弄技巧,会使程序的可读性差。所有的代码尽可能遵循ANSI C 标准,尽可能不使用ANSI C 未定义的或编译器扩展的功能。编程时首先达到正确性,其次考虑效率。说明:编程首先考虑的是满足正确性、健壮性、可维护性,可移植性等质量因素,最后才考虑程
7、序的效率和资源占用。保持一致性,尽可能多的使用相同的规则。坚守规范的总目标。说明:如果进行一个编码决定时,没有直接的规则可循。那么,所采取的决定必须符合规范的总目标。避免及少用全局变量。说明:不允许跨文件的全局变量。为了避免各种副作用。修正老的代码。说明:修正代码也是软件编程一个过程。按规范对老的代码进行修正,本身也是为了将来再维护老代码的方便。Q/ZX B XXX 2003 第 3 页 共 36 页4命名规则规则:规则 4.1:宏、常量,都要使用全大写字母.正例:DISP_BUF_SIZE,MIN_VALUE,MAX_VALUE等等规则 4.2:变量名字和函数名采用骆驼式命名,由前后缀加英语
8、单词或单词的缩写组合而成,每个单词的第一个字母为大写,其余为小写。变量名和函数名只能由英文字母,数字,及下划线的一个子集来组成,并严格禁止使用连续的下划线,下划线也不能出现在标识符头或结尾(预编译开关除外)。说明:命名时遵循:a)名字以小写字母的前缀开始;b)在两个单词之间一般不再用下划线“_”来连接;c)单词必须是有意义的,拒绝毫无意义的单词,见反例;d)常用计算值的限定词,如 total,averages,max,count 等;常用反义词如:max/min,input/output,next/previous等。正例:chMapIndex;反例:xxx YYY2规则 4.3:使用一致的前
9、缀来区分变量的活动范围。说明:变量活动范围前缀规范如下:g_ :全局变量s_ :模块内静态变量空 :局部变量不加范围前缀v_ :函数参数变量名中除去前缀的其他部分要符合规则4.2。规则 4.4:一致地使用缩写.说明:一律使用公司缩写字典中规定的缩写Q/ZX B XXX 2003 第 4 页 共 36 页表 1 常用缩略语表常用词缩写ArgumentArgBufferBufClearClrClockClkCompareCmpConfigurationCfgContextCtxDelayDlyDeviceDevDisableDisDisplayDispEnableEnErrorErrFunctio
10、nFnctHexadecimalHexHigh Priority TaskHPTI/O SystemIOSInitializeInitMailboxMboxManagerMgrManualManMaximumMaxMessageMsgMinimumMinMultiplexMuxOperating SystemOSOverflowOvfParameterParamPointerPtrPreviousPrevPriorityPrioReadRdReadyRdyRegisterRegScheduleSchedSemaphoreSemStackStkSynchronizeSyncTimerTmrQ/Z
11、X B XXX 2003 第 5 页 共 36 页5常用数据及变量要求建立自己的数据类型,以增加程序的可变动性,并使其成为自说明的。数据初始化容易产生错误,因此应采用适当的技术来避免由意外初始值所产生的错误。尽量减小变量的作用域。把对变量引用集中到一起,应尽量使变量成为局部或模块的,避免使用全局变量。使每个变量有且仅有一个功能。并不是因为全局数据危险才避免使用它们,而是因为可以用更好的技术来代替它。如果全局数据确实不可避免的话,应通过存取子程序来对其进行存取操作。存取子程序不仅具备全局变量和全部功能,而且可以提供更多的功能。规则:规则 5.1:有名结构和联合必须被类型化。正例:typedef
12、struct char nameNAME_SIZE;INT16U score;T_STUDENT;规则 5.2:不可将布尔值直接与TRUE或者 1 进行比较。说明:根据布尔类型的语义,零值为“假”(记为 FALSE),任何非零值都是“真”(记为 TRUE)。TRUE的值究竟是什么并没有统一的标准。规则 5.3:一个变量一个功能,不能把一个变量用作多种用途。说明:一个变量只用来表示一个特定功能,不能把一个变量作多种用途,即同一变量取值不同时,其代表的意义也不同。反例:变量 PageCount 代表是已经打印的页数,但当它等于-l 时则表示发生了错误;变量CustomerID 代表的是顾客号码,但
13、当它的值超过500,000 时,CustomerId减500,000 表示一个过期未付款的帐号;规则 5.4:简单局部变量在定义时赋初值。复杂局部变量在变量统一定义完成后即刻赋初值。说明:对复杂变量要求memset清零后才对个别域赋初值。正例:WORD *pTemp=NULL;/*variable definition section*/NP55_msc_cmd_args_t struCmdArgs;,/*initialize local variable*/memset(&struCmdArgs,0,sizeof(struCmdArgs);,Q/ZX B XXX 2003 第 6 页 共 3
14、6 页规则 5.5:for循环语句中,初始化语句仅对循环变量赋初值,不允许对其它变量进行赋值。反例:for (wLoop=0,pTemp=NULL;wLoop MAX_SLOT_NUM;wLoop+)应为:pTemp=NULL;for (wLoop=0;wLoop ”不需要用括号表示有效级。正例:if(comData-dataUnion.Data.ReqType=CH_Init_Req_M)|(comData-dataUnion.Data.ReqType=CH_Subseq_Req_M)建议 5.2:尽量使用含义直观的常量来表示那些将在程序中的数字或字符串。正例:#define MAX_VAL
15、UE 200 /*macro constant */建议 5.3:不能在同一个系统中重复定义相同的宏或类型结构。建议 5.4:使用可以移植的数据类型。说明:禁止使用C数据类型。使用基于目标处理器和编译器声明的数据类型。正例:表 2 常用可移植数据类型表TypedefunsignedCharBOOLEAN;/*Logical data type(TRUE or FALSE)*/TypedefunsignedCharINT8U;/*Unsinged 8 bit value */TypedefsignedCharINT8S;/*Signed 8 bit value */Typedefunsigned
16、ShortINT16U;/*Unsigned 16 bit value */TypedefSignedShortINT16S;/*Signed 16 bit value */TypedefFloatFP32;/*32 bit,single prec.Floating-point */TypedefdoubleFP64;/*64bit,double prec.Floating-point */Q/ZX B XXX 2003 第 7 页 共 36 页6程序语句要求本部分主要规定了软件编码过程中各类语句的书写规范,力求使书写的代码整洁易懂。规则:规则 6.1:顺序语句按照语句完成的功能划分程序块,一
17、个程序块可以有120 条语句。不同功能块之间必须有空行。规则 6.2:程序每一行的字符数不能超过132 个。说明:计算机显示器一行所能显示的字符有限,超过一屏的语句很难读。限制每行程序的字符数可以增强程序阅读的方便性。一般性原则,一条语句的字符总数不超过一屏。规则 6.3:在程序中较长的表达式分行书写,在优先级比较低的操作符后另起一行。说明:有的表达式比较复杂,如果采用适当的分行书写,可以使程序美观而且易于理解。具体如何格式化续行,需注意以下几点:使续行明显,指能清楚地表明该行不是一条语句的结尾,最好的方法是将该行独立出来后有明显的语法错误,譬如用算术运算符、逻辑运算符等作为行尾,如:if(m
18、sg-format=CH_A_Format_M&hData-officeType=CH_BSC_M)TotalBill=TotalBill+CustomerPurchases ID +SalesTax(CustomerPurchases ID );把紧密关联的元素放在一起,下面是个 反例:TotalBill=TotalBill+CustomerPurchases ID +SalesTax(CustomerPurchases ID );函数调用的续行可退后标准格数,如:DrawLine(Wnd.North,Wnd.South,Wnd.East,Wnd.West,CurrentWidth,Curr
19、entAttribute);赋值语句的续行应写在赋值号以后,如:TotalBill=TotalBill+CustomerPurchases ID +SalesTax(CustomerPurchases ID );规则 6.4:条件语句中的条件表达式最多不多于3 个条件表达式。说明:保持代码简洁。如果需要判断的条件较多,建议用临时布尔变量先计算是否满足条件。Q/ZX B XXX 2003 第 8 页 共 36 页规则 6.5:在 switch语句中,每一个case 分支必须使用break 结尾,最后一个分支必须是default分支。每一个必须用 括起来。说明:允许多个连续的case 分支使用同一
20、个break 结尾。避免漏掉break 语句造成程序错误。同时保持程序简洁。还需要注意:“”“”与 switch,default对齐,“必须另起一行书写。规则 6.6:if、for、while、do 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 。规则 6.7:不使用goto 语句。说明:使用 goto 语句只允许向后跳转。使用goto 语句需征得项目经理的允许。规则 6.8:每行只定义一个变量,有意识地安排变量定义顺序并使多个变量定义语句间对齐。正例:WORD index;WORD tempIndex;chHOCData_T*hocData;chHOAData_T*hoaD
21、ata;规则 6.9:在条件判断语句中,当整型变量与0 比较时,不可模仿布尔变量的风格,应当将整型变量用“=”或“!=”直接与0 比较。正例:if(iValue=0).if(iValue!=0).反例:if(iValue)/会让人误解 iValue是布尔变量if(!iValue)规则 6.10:不可将浮点变量用“=”或“!=”与任何数字比较。说明:无论是 float还是 double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“=”或“!=”与数字比较,应该转化成“=”或“=”形式。Q/ZX B XXX 2003 第 9 页 共 36 页反例:if(fResult=0.0)/隐含错误
22、的比较其中 EPSINON 是允许的误差(即精度)。建议:建议 6.1:if、for、do while、while语句循环嵌套总次数不大于5 次。建议 6.2:if/else语句中:“”“”与“if”对齐,这样做的好处是通过寻找“”“”对就能把握住程序的逻辑结构,可读性很好,“必须另起一行书写。较长的条件判断语句按以上续行的原则分成若干行。尽量在最后添加else,以确保逻辑的完备性,可在else 中增加断言。建议 6.3:for语句中:一般用 i,j,k 及有意义的单词如index,day 等来作为循环的计数,必须注意计数值的范围以防止死循环。循环条件中,三条语句之间添加空格以增加可读性。“”
23、“”与“for”对齐,“必须另起一行书写。在循环体中一般不使用break,continue。循环的长度不宜过长,做到一目了然。正例:f or(i=0;i CTMALFlag)|!(facdir2-CDMATMAHOList.Num)如果一行放不下,则可以分成两行,如:i f(comData-dataUnion.Data.ReqType=CH_Init_Req_M|comData-dataUnion.Data.ReqType=CH_Subseq_Req_M)用空格、断行使函数参数更好读,如:DISPATCH_MSG(&ccuSlaveMsgMap,paraIn);ASEND(cahHOCompE
24、vent,(BYTE far*)msgOut,(WORD)sizeof(*msgOut),chBSSAPPID);建议 6.6:把相关的赋值语句对齐。说明:如果几个赋值语句是相关的,则应该把等号对齐。正例:cmPDBResbModule.Head =0;cmPDBResbModule.Tail=wMaxNumOfPDB-1;cmPDBResbModule.Free=wMaxNumOfPDB;cmPDBResbModule.Address=pPDBAddr;cmPDBResbModule.Size=wPDBSize;cmPDBResbModule.MaxNumber=wMaxNumOfPDB;建
25、议 6.7:把相关的宏定义语句对齐。Q/ZX B XXX 2003 第 11 页 共 36 页7布局要求程序布局的目的是显示出程序良好的逻辑结构,提高程序的准确性、连续性、可读性、可维护性。更重要的是,统一的程序布局和编程风格,有助于提高整个项目的开发质量,提高开发效率,降低开发成本。同时,对于普通程序员来说,养成良好的编程习惯有助于提高自己的编程水平,提高编程效率。因此,统一的、良好的程序布局和编程风格不仅仅是个人主观美学上的或是形式上的问题,而且会涉及到产品质量,涉及到个人编程能力的提高,必须引起大家重视。程序布局应遵循的原则:正确表达出程序的逻辑结构自始至终地体现代码的逻辑结构提高可读性
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 编程 规范 forC
限制150内