2002.11.301编程规范的作用提高源程序的可读性和可维护性降低错误的机会提高源代码可重用性和质量2002.11.302规范的三种形式原则:编程时应该坚持的指导思想。规则:编程时必须遵守的约定。建议:编程时必须加以考虑的约定。2002.11.303规范的内容1基本原则2布局3注释4命名规则5变量、常量与类型6表达式与语句7函数与过程8可靠性9可测试性10断言与错误处理2002.11.304基本原则【原则1-1】首先是为人编写程序,其次才是计算机。说明:这是软件开发的基本要点,软件的生命周期贯穿产品的开发、测试、生产、用户使用、版本升级和后期维护等长期过程,只有易读、易维护的软件代码才具有生命力。2002.11.305基本原则【原则1-2】保持代码的简明清晰,避免过分的编程技巧。简单是最美。保持代码的简单化是软件工程化的基本要求。不要过分追求技巧,否则会降低程序的可读性。2002.11.306基本原则【原则1-3】所有的代码尽量遵循ANSIC标准。所有的代码尽可能遵循ANSIC标准,尽可能不使用ANSIC未定义的或编译器扩展的功能。2002.11.307基本原则【原则1-4】编程时首先达到正确性,其次考虑效率。编程首先考虑的是满足正确性、健壮性、可维护性、可移植性等质量因素,最后才考虑程序的效率和资源占用。2002.11.308基本原则【原则1-5】避免或少用全局变量。过多地使用全局变量,会导致模块间的紧耦合,违反模块化的要求。2002.11.309基本原则【原则1-6】尽量避免使用GOTO语句。2002.11.3010基本原则【原则1-7】尽可能复用、修正老的代码。尽量选择可借用的代码,对其修改优化以达到自身要求。2002.11.3011基本原则【原则1-8】尽量减少同样的错误出现的次数。事实上,我们无法做到完全消除错误,但通过不懈的努力,可以减少同样的错误出现的次数。2002.11.3012布局【规则2-1-1】遵循统一的布局顺序来书写头文件。#ifndef文件名_H(全大写)#define文件名_H其它条件编译选项#include(依次为标准库头文件、非标准库头文件)常量定义全局宏全局数据类型类定义模板(template)(包括C++中的类模板和函数模板)全局函数原型#endif2002.11.3013布局【规则2-1-2】遵循统一的布局顺序来书写实现文件。文件头注释#include(依次为标准库头文件、非标准库头文件)常量定义文件内部使用的宏文件内部使用的数据类型全局变量本地变量(即静态全局变量)局部函数原型类的实现全局函数局部函数2002.11.3014布局【规则2-1-3】使用注释块分离上面定义的节。/************************************************************数据类型定义************************************************************/typedefunsignedcharBOOLEAN;/**************************************************************函数原型*************************************************************/intDoSomething(void);2002.11.3015布局【规则2-1-4】头文件必须要避免重复包含。#ifndefMODULE_H#defineMODULE_H[文件体]#endif2002.11.3016布局【规则2-1-5】包含标准库头文件用尖括号,包含非标准库头文件用双引号“”。#includestdio.h#include“heads.h”2002.11.3017布局【规则2-1-6】遵循统一的顺序书写类的定义及实现。类的定义(在定义文件中)按如下顺序书写:公有属性,公有函数,保护属性,保护函数私有属性,私有函数类的实现(在实现文件中)按如下顺序书写:构造函数,析构函数公有函数保护函数私有函数2002.11.3018布局【规则2-2-1】程序中一行的代码和注释不能超过80列。包括空格在内不超过80列。2002.11.3019布局【规则2-2-2】if、else、elseif、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。if(varible1varible2){varible1=varible2;}反例:if(varible1varible2)varible1=varible2;2002.11.3020布局【规则2-3-4】结构型的数组、多维的数组如果在定义时初始化,按照数组的矩阵结构分行书写。intaiNumbers[4][3]={1,1,1,2,4,8,3,9,27,4,16,64}2002.11.3021布局【规则2-3-5】相关的赋值语句等号对齐。tPDBRes.wHead=0;tPDBRes.wTail=wMaxNumOfPDB-1;tPDBRes.wFree=wMaxNumOfPDB;tPDBRes.wAddress=wPDBAddr;tPDBRes.wSize=wPDBSize;2002.11.3022布局〖建议2-3-1〗在switch语句中,每一个case分支和default要用{}括起来,{}中的内容需要缩进。switch(iCode){case1:{DoSomething();//缩进4格break;}…//其它case分支default:{DoNothing();break;}}2002.11.3023布局【规则2-4-1】不同逻辑程序块之间要使用空行分隔。voidFoo::Hey(void){[Hey实现代码]}//空一行voidFoo::Ack(void){[Ack实现代码]}2002.11.3024布局【规则2-4-2】一元操作符如“!”、“~”、“++”、“--”、“*”、“&”(地址运算符)等前后不加空格。“[]”、“.”、“-”这类操作符前后不加空格。!bValue,~iValue,++iCount,*strSource,&fSum,aiNumber[i]=5,tBox.dWidth,tBox-dWidth2002.11.3025布局【规则2-4-3】多元运算符和它们的操作数之间至少需要一个空格。fValue=fOldValue;fTotal+fValueiNumber+=2;2002.11.3026布局【规则2-4-4】关键字之后要留空格。if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。2002.11.3027布局【规则2-4-5】函数名之后不要留空格。函数名后紧跟左括号‘(’,以与关键字区别。2002.11.3028布局【规则2-4-6】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。‘,’之后要留空格。‘;’不是行结束符号时其后要留空格。for凵(i凵=凵0;凵i凵凵MAX_BSC_NUM;凵i++){DoSomething(iWidth,凵iHeight);}2002.11.3029布局【规则2-4-7】注释符与注释内容之间要用一个空格进行分隔。正例:/*注释内容*///注释内容反例:/*注释内容*///注释内容2002.11.3030布局【规则2-5-1】长表达式(超过80列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。2002.11.3031布局if((iFormat==CH_A_Format_M)&&(iOfficeType==CH_BSC_M)){DoSomething();}2002.11.3032布局for(long_initialization_statement;long_condiction_statement;long_update_statement){DoSomething();}//for循环语句续行在初始化条件语句处对齐2002.11.3033布局//函数声明的续行在第一个参数处对齐BYTEReportStatusCheckPara(HWNDhWnd,BYTEucCallNo,BYTEucStatusReportNo);2002.11.3034布局//赋值语句的续行应在赋值号处对齐fTotalBill=fTotalBill+faCustomerPurchases[iID]+fSalesTax(faCustomerPurchases[iID]);2002.11.3035布局【规则2-5-2】函数声明时,类型与名称不允许分行书写。正例:externdoubleFARCalcArea(doubledWidth,doubledHeight);反例:externdoubleFARCalcArea(doubledWidth,doubledHeight);2002.11.3036注释【规则3-1】C语言的注释符为“/*…*/”。C++语言中,多行注释采用“/*…*/”,单行注释采用“//…”。2002.11.3037注释【规则3-2】一般情况下,源程序有效注释量必须在20%以上。注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。有效的注释是指在代码的功能、意图层次上进行注释,提供有用、额外的信息。2002.11.3038注释【规则3-3】注释使用中文。对于特殊要求的可以使用英文注释,如工具不支持中文或国际化版本。2002.11.3039注释【规则3-4】文件头部必须进行注释,包括:.h文件、.c文件、.cpp文件、.inc文件、.def文件、编译说明文件.cfg等。注释必须列出:版权信息、文件标识、内容摘要、版本号、作者、完成日期、修改信息等。2002.11.3040注释/**********************************************************************版权所有(C)2001,深圳市中兴通讯股份有限公司。**文件名称://文件名*文件标识://见配置管理计划书*内容摘要://简要描述本文件的内容,包括主要模块、函数及其功能的说明*其它说明://其它内容的说明*当前版本://输入当前版本*作者://输入作者名字及单位*完成日期://输入完成日期,例:2000年2月25日**修改日期版本号修改人修改内容*---------------------------------------------------------------*2002/08/01V1.0XXXXXXXX******************************************************************/2002.11.3041注释【规则3-5】函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、访问和修改的表、修改信息等。说明:注释必须列出:函数名称、功能描述、输入参数、输出参数、返回值、修改信息等。2002.11.3042注释/***********************************************************************函数名称://函数名称*功能描述://函数功能、性能等的描述*访问的表://(可选)被访问的表,此项仅对于有数据库操作的程序*修改的表://(可选)被修改的表,此项仅对于有数据库操作的程序*输入参数://输入参数说明,包括每个参数的作用、取值说明及参数间关系*输出参数://对输出参数的说明。*返回值://函数返回值的说明*其它说明://其它说明*修改日期版本号修改人修改内容*-----------------------------------------------*2002/08/01V1