欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C&C++软件编程规范.pdf

    • 资源ID:89818194       资源大小:7.73MB        全文页数:62页
    • 资源格式: PDF        下载积分:12金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C&C++软件编程规范.pdf

    内部资料,注意保密编程规范教材录前言软件编程规范总则.3第 一 章 排 版.4第 二章注释.10第三章标识符命名.18第四章可读性.21第五章变量、结构.23第六章函数、过程.30第七章可测性.40第八章程序效率.45第九章质量保证.50第十章代码编辑、编译、审查.57第十 一 章 代码测试、维护.59第十 二 章 宏.61编程规范前言软件编程规范总则为了提高源程序的质量和可维护性,最终提高公司软件产品生产力,我们有必要对公司软件产品的源程序的编写风格作出统一的规范约束。本规范总则是独立于具体语言的编程规则的总的原则,针对不同编程语言或应用环境的编程规范在遵守本规范总则的基础上,还必须遵守相应语言和就用环境的编程规范。本规范总则适用于公司所有产品以及对外合作委托开发产品的软件源程序。本规范总则的内容包括:排版、注释、标识符命名、变量使用、代码可测性、程序效率、质量保证、代码编译、单元测试、程序版本与维护等。本规范总则的示例都以C语言为背景,采用以下的术语描述:规则:编程时强制必须遵守的原则。建议:编程时必须加以考虑的原则。说明:对此规则或建议进行必要的解释。示例:对此规则或建议从正、反两个方面给出例子。第3页3编程规范第一章排版q-1:程序块要采用缩进风格编写,缩进的空格数为4个。说明:对于由开发工具自动生成的代码可以有不一致。唯一例外的是编译开关和宏定义。如下各举一个例子:编译开关例子:in t SendMsg(EXEC_MSG*pMsg)#ifd e f _UNIT_DEBUGD oTestFunc(pM sg);#e lseDoFunc(pM sg);#er)d if)宏定义的例子:in t SendMsg(EXEJMSG*pMsg)#d efin e SET_MSG_HEAD i f (pMsg)(SetM sgHead(pM sg);e ls e (SetM sgH eadZero();).n函数其它代码)*1-2:相对独立的程序块之间、变量说明之后必须加空行。示例:如下例子不符合规范。i f (!v a lid _ n i(n i)(/program coderep ssn _ in d =ss n _ d a ta in d e x.rep ssn _ in d ex;第4页4编程规范repssn_ni=ssn_dataindex,ni;应如下书写if(!valid_ni(ni).,/program code)repssn_ind=ssn_dataindex.repssn_index;repssn_ni=ssn_dataindex.ni;空行可以使程序结构比较清晰。逻辑上关系比较紧密的代码放在一起,逻辑上相对比较独立的部分用空行隔开。)1-3;较长的语句(80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。示例:perm_count_msg.head.len=NO7_TO_STAT_PERM_COUNT_LEN+STAT_SIZE_PER_FRAM*sizeof _UL);act_task_tableframe_id*STAT_TASK_CHECK_NUMBER+index.occupied=stat_poiindex.occupied;act_task_tabletaskno.duration_true_or_false=SYS_get_sccp_statistic_state(stat_item);report_or_not_flag=(taskno MAX_ACT_TASK_NUMBER)&(n7stat_stat_item_valid(stat_item)&(act_task_tabletaskno.result_data!=0);长语句分多行书写比较美观。在低优先级操作符处划分新行,可使每一行具有相当独立而完整的含义,从而比较清晰。折行时,操作符要放行首。11-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。示例:if(taskno max_actask_number)&(n7stat_stat_item_valid(stat_item)|./program code)for(i=0,j =0;(i first_word_length)&(j for、d。、while、case、switch、defaul七等语句自占一行,且 i、for dowhile等 语 句 的 执 行 语 句 部 分 无 论 多 少 都 要 加 括 号 。示例:如下例子不符合规范。if(pUserCR=NULL)return;应如下书写:if(pUserCR=NULL)|return;)关键字独占一行是为了使程序结构清晰可读。if、for.do.while等语句的执行语句部分无论多少都要加括号 ,下面的例子来解释原因:如果写成:if(NULL=pUserCR)return;以后的测试中发现这种条件满足时,还要做一些其它处理,比如要写日志,那么很容易就写成了下面的语句:if(pUserCR=NULL)第6页6编程规范WriteLog(1 Invalid UserCR*);return;写成这样就大错特错了,不管pUserCR是否为NULL,程序都会执行到return语句,造成逻辑错误。为了避免这样的问题,因此要求if、for、do while的执行语句,不管有多少,都要用 括起来。1-8:对齐只使用空格键,不使用TAB键。说明:以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐,不要使用BC作为编辑器合版本,因为BC会自动将8个空格变为一个TAB键,因此使用BC合入的版本大多会将缩进变乱。目前大多数的编程工具都提供奖TAB键和成空格键。*1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。对于case语句的缩进说明如下:如果case语句中不需定义新的变量,则为:switch(pMsg-iMsgType)(case EXEC_MSG:OnExecMsg(pMsg);break;/其它case处理语句如果case语句中需要定义新的变量,则必须用 括起来,缩进为:switch(pMsg-iMsgType)case EXEC_MSG:(DWORD dwDataLen=pMsg-dwMemLen-sizeof(MSG_HEAD);OnExecMsg(pMsg,dwDataLen);break;)case SHAKE_HAND_MSG:1-10:程序块的分界符(如C/C+语言的大括号 和 )应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for,第7页7编程规范do、while switch case语句中的程序都要采用如上的缩进方式。示例:如下例子不符合规范。for()/program code)if(.)./program code)void example_fun(void)./program code)应如下书写。for(.)./program code)if(.)(./program codevoid example_fun(void)(./program code1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如一),后不应加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C+语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。示例:第8页8编程规范(1)逗号、分号只在后面加空格。int a,b,c;(2)比较操作符,赋值操作符 =、算 术 操 作 符 逻 辑 操 作 符位域操作符=MAX_TIME_VALUE)a=b+c;a*=2;a=b A 2;(3)(地址运算符)等单目操作符前后不加空格。*P=a;/内 容 操 作 与 内 容 之 间flag=lisEmpty;/非操作!与内容之间p=&mem;/地址操作&与内容之间i+;/+与内容之间(4)前后不加空格。p-id=pid;/指针前后不加空格(5)if、for、while switch等与后面的括号间应加空格,使if等关键字更为突出、明显。if(a=b&c d)(6)if for、while switch后面的:“(”,左边有空格,右边没有空格。“)”,左边没有空格,右边有空格。V21-1:一行程序以小于80字符为宜,不要写得过长。第9页9编程规范第二章注释*2-1;一般情况下,源程序有效注释量必须在20%以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。20%的标准要求不高,因为文件头部的注释,函数头部的注释就占了很大的比例。因此达到20%注释量,对实际语句的注释量要求不高。现在大家在修改问题单的时候,务必要有注释。否则其他人根本不明白为什么此处要求修改,修改的目的是什么。请大家把这条做为问题单审核的一个要求。*2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/*Copyright(C),19881999,Huawei Tech.Co.z Ltd.File name:/文件名Author:Version:Date:/作者、版本及完成日期Description:/用于详细说明此程序文件完成的主要功能,与其他模块/或函数的接口,输出值、取值范围、含义及参数间的控/制、顺序、独立或依赖等关系Others:/其它内容的说明Function List:/主要函数列表,每条记录应包括函数名及功能简要说明History:/修改历史记录列表,每条修改记录应包括修改日期、修改/者及修改内容简述1.Date:Author:Modification:2.,第10页10编程规范目前各种编辑器都提供宏的功能,通过宏功能可以方便的生成函数头,文件头的格式化注释。*2-3:源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/*Copyright(C),19881999,Huawei Tech.Co.,Ltd.FileName:test.cppAuthor:Version:Date:Description:/模块描述Version:/版本信息Function List:/主要函数及其功能1.-History:/历史修改记录 David 96/10/12 1.0 build this moudle*/说明:Description项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。*2-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。示例:下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/*Function:/函数名称Description:/函数功能、性能等的描述Calls:/被本函数调用的函数清单Called By:/调用本函数的函数清单Table Accessed:/被访问的表(此项仅对于牵扯到数据库操作的程序)Table Updated:/被修改的表(此项仅对于牵扯到数据库操作的程序)Input:/输入参数说明,包括每个参数的作/用、取值说明及参数间关系。第11页11编程规范Output:/对输出参数的说明。Return:/函数返回值的说明Others:/其它说明*/*2-5:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。实际编程过程中,代码与注释的书写关系有三种:1)先写一行代码,然后马上写注释,也即边写代码边写注释2)先写注释,再写代码3)先把代码全写完了,再补注释。第3)种方式是应该严格避免和禁止的。第一种方式应用比较多,主要用与代码不是特别复杂的情况。第二种方式主要用于代码结构非常复杂的情况,举例如下:short ExecSql(PARAM_LIST*pParamListA char*pUserName,char*pPasswd,int iExecFlag)/先检查参数,看是否满足可执行Sql的五种条件/准备分析S q l 语句的全部环境和数据/分析s q l 语句/执行S q l 语句,并盘点是否有结果集/将执行结果打包返回代码比较复杂时,先写注释,标识出程序的逻辑处理过程。然后再对每一个逻辑处理过程进行语句书写。这样程序写起来思路比较清晰,可读性也好。*2-6:注释的内容要清楚、明了,含义准确,防止注释二义性。说明:错误的注释不但无益反而有害。注释的要点是准确,没有二意性。把代码说清楚是目的。i 规则2-7:避免在注释中使用缩写,特别是非常用缩写。说明:在使用缩写时或之前,应对缩写进行必要的说明。*2-8:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。示例:如下例子不符合规范。第12页12编程规范例1:/*get replicate sub system index and net indicator*/repssn_ind=ssn_dataindex.repssn_index;repssn_ni=ssn_dataindex.ni;例2:repssn_ind=ssn_dataindex.repssn_index;repssn_ni=ssn_dataindex.ni;/*get replicate sub system index and net indicator*/应如下书写/*get replicate sub system index and net indicator*/repssn_ind=ssn_dataindex.repssn_index;repssn_ni=ssn_dataindex.ni;D-9:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。示例:/*active statistic task number*/#define MAX_ACT_TASK_NUMBER 1000#define MAX_ACT_TASK_NUMBER 1000/*active statistic task number*/D T O:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。示例:可按如下形式说明枚举/数据/联合结构。/*seep interface with seep user primitive message name*/enum SCCP_USER_PRIMITIVE(N_UNITDATA_INDZ/*seep notify seep user unit data come*/N_NOTICE_IND,/*seep notify user the No.7 network can not*/*transmission this message*/N_UNITDATA_REQZ/*seep user1s unit data transmission request*/;对结构,类,枚举,联合必须对每项进行注释,这一点请参见主机分则。*2-11:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。示例:/*The ErrorCode when SCCP translate*/第13页13编程规范/*Global Title failure,as follows*/变量作用、含义/*0 SUCCESS 1 GT Table error*/*2 GT error Others-no use*/变量取值范围/*only function SCCPTranslate()in*/*this modual can modify itr and other*/*module can visit it through call*/*the function GetGTTransErrorCode()*/使用方法BYTE g_GTTranErrorCode;*2-12:注释与所描述内容进行同样的缩排。说明:可使程序排版整齐,并方便注释的阅读与理解。示例:如下例子,排版不整齐,阅读稍感不方便。void example_fun(void)(/*code one comments*/CodeBlock One/*code two comments*/CodeBlock Two应改为如下布局。void example_fun(void)/*code one comments*/CodeBlock One/*code two comments*/CodeBlock Two)*2-13:将注释与其上面的代码用空行隔开。示例:如下例子,显得代码过于紧凑。/*code one comments*/program code one/*code two comments*/program code two应如下书写/*code one comments*/program code one/*code two comments*/第14页14编程规范program code two*2-14:对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。变量的定义,如果不是充分自注释的,必须注释,写明其用途,取值范围等。if,for,while,switch 必须力U注释。12-15:对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。说明:这样比较清楚程序编写者的意图,有效防止无故遗漏break语句。示例(注意斜体加粗部分):case CMD_UP:ProcessUp();break;case CMD_DOWN:ProcessDown();break;case CMD_FWD:ProcessFwd();if()break;)else(ProcessCFW_B();/now jump in to case CMD_A)case CMD_A:ProcessA();break;case CMD_B:ProcessB();break;case CMD_C:ProcessC();break;第15页15编程规范case CMD_D:ProcessD();break;V22-1:避免在一行代码或表达式的中间插入注释。说明:除非必要,不应在代码或表达中间插入注释,否则容易使代码可理解性变差。%2-2:通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的。说明:清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释。%2-3:在代码的功能、意图层次上进行注释,提供有用、额外的信息。说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。示例:如下注释意义不大。/*if receive_flag is TRUE*/if(receive_f lag)而如下的注释则给出了额外有用的信息。/*if mtp receive a message from links*/i f(receive_flag)必须在代码的实际逻辑含义的层次上进行注释,这样的注释才是有效的注释。否则就失去了注释的作用。%2-4:在程序块的结束行右方加注释标记,以表明某程序块的结束。说明:当代码段较长,特别是多重嵌套时,这样做可以使代码更清晰,更便于阅读。示例:参见如下例子。if()(/program codewhile(index MAX_INDEX)/program code /end of while(index MAX_INDEX)/指明该条while语句结束 /end of if()/指明是哪条if语句结束V22-5:注释格式尽量统一,建议使用“/”第16页16编程规范实际使用过程中,/与/*/都可以,一般情况下我们建议使用.因为使用/*/不利于大段注释。注释与注释之间,纵向上要求对齐,这样比较美观。力2-6:注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。说明:注释语言不统一,影响程序易读性和外观排版,出于对维护人员的考虑,建议使用中文。程序中要始终使用一种语言进行注释,建议使用中文。第17页17编程规范第三章标识符命名*3-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。示例:如下单词的缩写能够被大家基本认可。temp可缩写为 tmp;flag可 缩 写 为 fig;statistic 可缩写为 stat;increment 可缩写为 inc;message可缩写为 msg;*3-2:命名中若使用特殊约定或缩写,则要有注释说明。说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。*3-3:自己特有的命名风格,要自始至终保持一致,不可来回变化。说明:个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。*3-4:对于变量命名,禁止取单个字符(如i、j、k.),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。示例:下面所示的局部变量名的定义方法可以借鉴。int liv_Width其变量名解释如下:1 局部变量(Local)(其它:g 全局变量(Global).)i 数据类型(Interger)v 变 量(Variable)(其它:c 常 量(Const).)W i d t h 变量含义这样可以防止局部变量与全局变量重名。实际编码中,我们规定如下:第18页18编程规范变量命名必须加类型头,并且推荐使用大小写混排方式。类成员变量必须以m_开头,全局变量必须以g_开头。如下命名是规范的:dwDataLen,pMsg,iExecFlag,binit,m_ulSessionNum,g_dwRefCnt常用类型头的对应表如下:类型类型头booleanbBytebtShortnWORDwintiDWORDdwunsigned longullong1指针Pchar*pszcharcCStringstr*3-5:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如采用UNIX的全小写加下划线的风格或大小写混排的方式,不要使用大小写与下划线混排的方式,用作特殊标识如标识成员变量或全局变量的m_和g _,其后加上大小写混排的方式是允许的。示例:Add_User不允许,addUser、AddUser,m_AddUser允许。%3-1:除非必要,不要用数字或较奇怪的字符来定义标识符。示例:如下命名,使人产生疑惑。#define _EXAMPLE_O_TEST_#define _EXAMPLE_1_TEST_void set_sls00(BYTE sis);应改为有意义的单词命名#define _EXAMPLE_UNIT_TEST_#define _EXAMPLE_ASSERT_TEST_void set_udt_msg_sls(BYTE sis);1/23-2:在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。说明:对接口部分的标识符应该有更严格限制,防止冲突。如可规定接口部分的变量与常量之第19页19编程规范前加上“模块”标识等。力3-3:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。说明:下面是一些在软件中常用的反义词组。add/removebegin/endcreate/destroyinsert/deletefirst/lastget/releaseincrement/decrementput/getadd/deletelock/unlockopen/closemin/maxold/newstart/stopnext/previoussource/targetshow/hidesend/receivesource/destinationcut/paste示例:up/downint min_sum;int max_sum;int add_user(BYTE*user_name);int delete_user(BYTE*user_name);V23-4:除了编译开关/头文件等特殊应用,应避免使用_EXAMPLE_TEST_之类以下划线开始和结尾的定义。编译开关一定要以下划线开头。第20页20编程规范第四章可读性,4-1:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。示例:下列语句中的表达式word=(high 8)|low(1)if(a|b)&(a&c)(2)if(a|b)(c&d)(3)如果书写为high 8|low由于high 8|low=(high8)I low,a|b&a&c=(a|b)(aa|b&a&ca I b c&d&c),(1)(2)不会出错,但语句不易理解;a|b c&d=a|(b Print_Rec Stat_Score为四个不同的函数;Student、Score为两个全局变量;Create表示创建,Modify表示修改,Access表示访问。其中,函数工nput_Rec、Stat_Score都可修改变量Score,故此变量将引起函数间较大的耦合,并可能增加代码测试、维护的难度。15-4:当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。说明:对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。*5-5:防止局部变量与公共变量同名。说明:若使用了较好的命名规则,那么此问题可自动消除。局部变量不允许与公共变量同名。C+中,由于 表示一个作用域,因此在一个函数内部的 中定义的变量是可以与此 外的变量重名的,但二者作用域不同。我们的编码中不允许这种情况出现,除非特殊需要。5-6:严禁使用未经初始化的变量作为右值。说明:特别是在C/C+中引用未经赋值的指针,经常会引起系统崩溃。不同的编译器对变量的默认初始化是不同的。为了避免不同编译器引起的差别,对变量,尤其第23页23编程规范是指针变量,强烈推荐在使用前将其初始化。V25-1:构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。说明:降低公共变量耦合度。V25-2:使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。说明:使用标准的数据类型,有利于程序的移植。示例:如下例子(在DOS下BC3.1环 境 中),在移植时可能产生问题。void main()register int index;/寄存器变量_AX=0 x4000;/_AX是BC3.1提供的寄存器“伪变量”./program codeV 25-3:结构的功能要单一,是针对一种事务的抽象。说明:设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中。示例:如下结构不太清晰、合理。typedef struct STUDENT_STRUunsigned char name8;/*student*s name*/unsigned char age;/*student1s age*/unsigned char sex;/*student1s sex,as follows*/*0-FEMALE;1-MALE*/unsigned charteacher_name8;/*the student teacher 1s name*/unisgned charteacher_sex;/*his teacher sex*/STUDENT;若改为如下,可能更合理些。typedef struct TEACHER_STRU第24页24编程规范unsigned char name8;/*teacher name*unisgned char sex;*teacher sex,as follows*0-FEMALE;1-MALE*TEACHER;typedef struct STUDENT_STRUunsignedcharname 8;*students name*unsignedcharage;student1s age*unsignedcharsex;student1s sex,as follows*0-FEMALE;1-MALE*/unsignedintteacher_ind;/his teacher index*STUDENT;外5-4:不要设计面面俱到、非常灵活的数据结构。说明:面面俱到、灵活的数据结构反而容易引起误解和操作困难。V25-5:不同结构间的关系不要过于复杂。说明:若两个结构间关系较复杂、密切,那么应合为一个结构。示例:如下两个结构的构造不合理。typedef struct PERSON_ONE_STRUunsignedchar name8;unsignedchar addr40;unsigned char sex;unsigned charcity15;PERSON.ONE;typedef struct PERSON_TWO_STRU(unsigned char name8;unsigned char age;unsigned char tel;PERSON_TWO;由于两个结构都是描述同一事物的,那么不如合成一个结构。typedef struct PERSON_STRUunsigned char name8;unsigned char age;unsigned char sex;第25页25编程规范unsigned char addr40;unsigned char city15;unsigned char tel;PERSON;/5-6:结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。说明:增加结构的可理解性、可操作性和可维护性。示例:假如认为如上的PERSON结构元素过多,那么可如下对之划分。typedef struct PERSON_BASE_INFO_STRUunsigned char name8;unsigned char age;unsigned char sex;PERSON_BASE_INFO;typedef struct PERSON_ADDRESS_STRUunsigned char addr40;unsigned char city15;unsigned char tel;PERSON_ADDRESS;typedef struct PERSON_STRUPERSON_BASE_INFO person_base;PERSON_ADDRESS person_addr;PERSON;达5-7:仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象。说明:合理排列结构中元素顺序,可节省空间并增加可理解性。示例:如下结构中的位域排列,将占较大空间,可读性也稍差。typedef struct EXAMPLE_STRUunsigned int valid:1;PERSON person;unsigned int set_f1g:1;EXAMPLE;第26页26编程规范若改成如下形式,不仅可节省1字节空间,可读性也变好了。typedf struct EXAMPLE_STRUunsigned int valid:1;unsigned int set_f1g:1;PERSON person;EXAMPLE;补充说明:设计数据结构忖要考虑存取效率。比如,32位机上,如果数据结构的成员在4字节对齐的位置上,CPU一个指令就可以存取。如果不再4字节对齐的位置上,CPU要消耗更多的指令存取。举例如下:不好的结构:Struct EXEC_MSGDWORD dwLen;/总消息长度,从头开始算起BYTEbtMsgType;/消息类型DWORD dwSerialNo;/流水号BYTEbtFlag;/执行标志WORDwRequestNum;/请求的记录数dwSerialNo,btFlag.wRequestNum都不在4字节对齐位置上,因此存取效率不好。可改良为:Struct EXEC_MSGDWORD dwLen;DWORD dwSerialNo;/总消息长度,从头开始算起/流水号BYTE btMsgType;/消息类型BYTE btFlag;/执行标志WORD wRequestNum;/请求的记录数V25-8:结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。说明:软件向前兼容的特性,是软件产品是否成功的重要标志之一。如果要想使产品具有较好的前向兼容,那么在产品设计之初就应为以后版本升级保留 定余地,并且在产品升级时必须第27页27编程规范考虑前一版本的各种特性。/5-9:留心具体语言及编译器处理不同数据类型的原则及有关细节。说明:如在C语言中,static局部变量将在内存“数据区”中生成,而非static局部变量将在“堆栈”中生成。这些细节对程序质量的保证非常重要。V25-10:编程时,要注意数据类型的强制转换。说明:当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。V25-11:对编译系统默认的数据类型转换,也要有充分的认识。示例:如下赋值,多数编译器不产生告警,但值的含义还是稍有变化。char chr;unsigned short int exam;chr=-1;exam=chr;/编译器不产生告警,此时exam为OxFFFF。V 2 5-1 2:尽量减少没有必要的数据类型默认转换与强制转换。V25-13:

    注意事项

    本文(C&C++软件编程规范.pdf)为本站会员(奔***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开