暴米花 发表于 2006-12-7 10:28:00

[转帖]C/C++语言编码规范,在您进行编码之前应该阅读的规范(For beginner)

<strong><br/><br/></strong><font color="#ff0000">C/C++语言编码规范</font><br/>来自:<a href="http://bbs.gameres.com/www.csdn.net" target="_blank"><font color="#9c0000">CSDN</font></a><br/>1.说明<br/>为了保证在软件开发过程中,全体成员的代码风格一致,便于维护,提高软件产品的质量和保持开发产品的延续性,特制定本编码规范。本规范详细规定了源代码书写、变量命名、函数/过程的书写、错误和异常处理等方面。<br/>2.&nbsp;程序约定<br/>2.1&nbsp;排版规则<br/>程序应采用缩进风格编写,每层缩进使用一个制表位(TAB),类定义、方法都应顶格书写;<br/>左花括号要另起一行,不能跟在上一行的行末;<br/>一个变量定义占一行,一个语句占一行;<br/>对独立的程序块之间、变量说明之后必须加空行;<br/>对于较长的语句(&gt;80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读;<br/>循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分;<br/>在结构成员赋值等情况,等号对齐,最少留一个空格;<br/>若函数或过程中的参数较长,则要进行适当的划分。<br/>形参的排序风格:<br/>&amp;Oslash; 最常使用的参数放在第一位;<br/>&amp;Oslash; 输入参数列表应放在输出参数列表的左边;<br/>&amp;Oslash; 将通用的参数放在特殊的参数的左边<br/>2.2&nbsp;命名约定<br/>2.2.1&nbsp;应用程序的命名<br/>“公司缩写”+模块名称+[版本]<br/>2.2.2&nbsp;子模块的命名<br/>每个子模块的名字应该由描述模块功能的1-3以单词组成。每个单词的首字母应大写。在这些单词中可以使用一些较通用的缩写。<br/>2.2.3&nbsp;变量的命名<br/>变量的命名的基本原则是使得变量的含义能够从名字中直接理解。可以用多个英文单词拼写而成,每个英文单词的首字母要大写,其中英文单词有缩写的可用缩写;变量的前缀表示该变量的类型;对于作用域跨越10行以上的变量名称不能少于4个字符,除循环变量,累加变量外不得使用I、j、k等名称的变量。变量分为取全局变量和局部变量,对于全局变量以加前缀“g_”来区分。<br/><br/><br/><br/><img src="http://images.gameres.com/bbs/style/snow/image/attachment.gif" border="0" alt=""/>本主题包含附件: <img src="http://images.gameres.com/bbs/image/fileicon/jpg.gif" border="0" alt=""/><a href="http://bbs.gameres.com/upload/sf_2004105175133.jpg" target="_blank"><font color="#9c0000">sf_2004105175133.jpg</font></a> (147204bytes)<br/><br/><a href="http://bbs.gameres.com/upload/sf_2004105175133.jpg" target="_blank"><img src="http://bbs.gameres.com/upload/sf_2004105175133.jpg" border="0" alt=""/></a><br/>

暴米花 发表于 2006-12-7 10:29:00

另外,要注意的是:全局变量在程序中不要定义太多,能用局部变量的就用局部变量。如果要使用相关的变量,建议采用类的方式或者结构的方式存放,以减少具体变量的个数。&nbsp;&nbsp;&nbsp;&nbsp;<br/>2.2.4&nbsp;常量的命名<br/>常量所有的字母均为大写。并且单词之间使用下划线”_”隔开。<br/>2.2.5&nbsp;函数/过程的命名<br/>函数/过程名称应该尽量使用能够表达函数功能的英文名称,函数名称中应该禁止使用如同function1,function2等含义不清的名称。单词间应该使用大小写分隔。全局函数/过程名称以“g_”前缀开始。<br/>2.2.6&nbsp;接口命名<br/>接口名称要以大写字母开头。如果接口包含多个单词,每个单词的首字母大写,其他字母小写,如果,这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写为Xml)<br/>2.2.7&nbsp;类的命名<br/>类名称要以大写字母开头;<br/>类名称如果包含多个单词,每个单词的首字母要大写,其他字母小写;如果这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写作Xml);<br/>类名称应该是一个名词或名词短语;<br/>类成员变量的命名规则与上述规则相同,但是要以“m_”开始,表示其为成员变量(Member);<br/>类名称不能出现下划线。<br/>2.2.8&nbsp;方法的命名<br/>方法名称以小写字母开头;<br/>方法名称如果包含多个单词,除了第一个单词外,每个单词的首字母大写,其它字母小写。如果这些单词是缩略语(例如XML),也要首字母大写,其它字母小写(写作Xml)。<br/>方法名称应该是一个动词或动名词短语,意思是“完成什么功能”,“执行什么操作”;<br/>2.2.9&nbsp;数据库的命名<br/>表:采用“模块名简称+前缀+’_’+表名”的命名规则。<br/>&amp;Oslash; 表名&amp;Oslash; 以能理解该表的内容为原则,&amp;Oslash; 可由中文表示,&amp;Oslash; 也可由代表此表含义的英文字母组成,&amp;Oslash; 首字母大写;<br/>&amp;Oslash; 前缀代表此表类别。<br/>视图:采用“模块名+’_’+视图名+’视图’”的命名规则,通常由8个以内汉字组成。<br/>存储过程:采用“Proc+模块名+’_’+存储过程名”的命名规则。<br/>触发器:采用“模块名+’_’+触发类型+’_’+表名”的命名规则,如果有多个触发类型,则可以叠加在一起。<br/>字段:字段的命名以能理解该字段的含义为原则,通常由多个英文单词加前缀拼写而成,而组成字段名称的首字母应大写。单词有缩写的可用缩写。字段的前缀表示该字段的数据类型,其取值详见“数据类型”描述。原则上,字段的命名长度不超过18字节;描述字段的中文名称,用数据库创建工具设计数据库时,需要输入。<br/>2.3&nbsp;参数的约定<br/>&nbsp;&nbsp;&nbsp;&nbsp;2.3.1&nbsp;输入参数的约定<br/>有些函数有输入参数,这些参数指由函数外部(调用者)输入,并在函数内部使用。在函数业务流程说明后跟输入参数说明区,用“输入参数”或“Input&nbsp;Parameters”标记。在参数名列表中的每个参数后增加该参数的注释。<br/>2.3.2&nbsp;输出参数的约定<br/>有些函数有输出参数,这些参数指由函数外部(调用者)定义,在函数内部使用并返回给调用者的参数。在输入参数说明区后跟输出参数说明区,用“输出参数”或“Output&nbsp;Parameters”标记。在参数名列表中的每个参数后增加该参数的注释。另外输出参数一般以指针或应用输出。<br/>2.3.3&nbsp;返回值的约定<br/>每个函数均有返回值,除非操作非常简单。对于有不同状态的返回值,建议用long型的返回值,0为成功。对于出错类返回值,在同一层次的模块,用统一代码表示。在输出参数说明区后跟返回值说明区,用“返回值”或“Return&nbsp;values”标记。返回值说明,要说明各种不同类型返回值以及它们的含义。<br/>2.4&nbsp;注释约定<br/>在软件中对每个文件头,自定义函数和变量,重要的处理过程都要有必要的注释。<br/>2.4.1&nbsp;源程序头的注释和规范<br/>每个文件头插入注释,标明文件的用途和作者,注释如下:(注释尽量用中文)<br/>&nbsp;&nbsp;&nbsp;&nbsp;//程序名称<br/>&nbsp;&nbsp;&nbsp;&nbsp;//版权说明<br/>&nbsp;&nbsp;&nbsp;&nbsp;//版本号:<br/>//功能:<br/>//开发人:<br/>//开发时间:<br/>//修改者:<br/>//修改时间<br/>//修改简要说明<br/>//其他<br/>2.4.2&nbsp;函数的注释<br/>每个函数前面注明函数的功能和输入,输出。注释为:<br/>//名称<br/>//功能:(说明函数的功能)<br/>//输入参数:(说明每个输入参数的用途和取值约定)<br/>//输出参数:(说明每个输出参数的用途和取值约定)<br/>//返回:(说明返回值,返回值的含义和约定)<br/>2.4.3&nbsp;变量注释<br/>直接在变量后面注明变量的用途和取值约定,如:<br/>int&nbsp;status;&nbsp; //记录处理状态,0:&nbsp;成功,1:&nbsp;错误<br/>2.4.4&nbsp;类型定义注释<br/>指类和记录等等定义的注释。在注释中标明定义的用途。<br/>2.4.5&nbsp;区的注释<br/>同一个类的成员方法要求排列在一起,共同协作而实现同一个功能的函数和过程要求排列在一起。代码通常使用几个函数和过程来实现某一项功能,这时候需要使用区注释将这些具有共同目的的函数和过程标明出来。<br/>使用整行的”*”作为隔离行,让程序清晰可读。<br/>一般删除的代码不建议直接删除,最好用“//”注释起来。<br/>2.4.6&nbsp;代码中的注释<br/>在代码中要求注释的地方有:<br/>代码中的关键部分;<br/>在使用特殊算法或者逻辑性较强的代码;<br/>在修改或删除代码部分,需要加注释;修改/删除人,目的.<br/>2.5&nbsp;变量的作用范围<br/>尽量做到缩小变量的作用范围,对于变量是指针的,应遵循以下约定:<br/>在局部分配的空间在局部释放。<br/>函数体内不能分配空间并将空间指针作为函数参数返回。<br/>动态全局空间在程序结束时一定要释放。<br/>所有动态分配的空间在对应层次的模块释放,并且用完马上释放。不重复释放相同的指针。<br/>2.6&nbsp;函数/过程的定义<br/>在函数的定义处应当增加本函数的功能描述的注释。<br/>用一句话描述清楚功能。<br/>可用英文或中文。<br/>功能注释格式要求所有代码一致。<br/>2.7&nbsp;函数业务流程的定义<br/>在函数功能描述后,要增加函数的主要业务流程注释。<br/>可以用多行描述,以解释清楚业务流程为主。<br/>可用英文或中文。<br/>业务流程注释格式要求所有代码一致。<br/>业务流程注释可以尽量详细,注释的长度可以与代码长度差不多,但是不要太长。<br/>比如处理N阶乘的函数业务流程定义如下:<br/>/*&nbsp;Process:&nbsp;N&nbsp;factorial&nbsp;use&nbsp;callback&nbsp;function&nbsp;to&nbsp;implement.&nbsp;If&nbsp;N&nbsp;==&nbsp;0&nbsp;then&nbsp;*/&nbsp;<br/>/*&nbsp;return&nbsp;1&nbsp;else&nbsp;return&nbsp;N-1&nbsp;factorial.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br/>或<br/>/*&nbsp;过程:N阶乘利用回调函数实现。如果N等于零,则返回1,&nbsp;&nbsp;&nbsp;*/<br/>/*&nbsp;否则返回&nbsp;N-1的阶乘。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br/>注意:函数业务流程的说明并不在乎有多长,但是在乎能否说明过程。有些像N阶乘的函数流程比较简单,但是有些比较复杂。当比较复杂时,可以用标号来说明。<br/>3.&nbsp;接口/函数过程调用的约定<br/>几乎每一个项目中,都存在开发接口API给其他应用调用,本规范适用于标准C开发接口API。<br/>3.1&nbsp;头文件(.h文件)<br/>提供给使用API的应用的标准C头文件。头文件必须包含三部分。<br/>防止头文件重复引用的编译条件<br/>即我们在创建头文件时必须增加以下的条件编译:#ifndef&nbsp;&nbsp;#define&nbsp;&nbsp;#endif。比如要防止abcqueue.h头文件被重复引用,必须在abcqueue.h增加以上的条件编译:<br/>#ifndef&nbsp;_ABCQUEUE_H<br/>#define&nbsp;_SMBUS_H<br/>……<br/>#endif<br/>函数定义<br/>函数的定义是为了方便应用知道LIB、DLL里引出了怎样的API,应该如何使用。如上面的例子。<br/>错误代码定义<br/>错误代码是接口API里因为内部某种错误返回的代码,它告诉应用出现了什么错误,以便开发者进行调试和排错。<br/>3.2&nbsp;函数<br/>提供给应用调用的执行体。实现函数时,必须根据以下规范开发<br/>3.2.1&nbsp;变量定义<br/>在函数代码中,变量的定义必须放在第一部分,同时给指针类型的变量赋空(NULL)。<br/>3.2.2&nbsp;参数合法性检查<br/>在使用应用传递的输入输出参数之前,必须对参数进行合法性检查,保证代码执行使用参数的安全性。比如,应用的一个输出参数地址为NULL,如果处理之前不检查参数的合法性,那么将导致一个内存错误;如果检查合法性,就不会造成代码执行时出现问题。<br/>3.2.3执行处理<br/>在处理代码开发中,必须注意以下的一系列的问题:<br/>对应用传递的输入输出参数,禁止使用strcpy,&nbsp;strlen,&nbsp;strcat,&nbsp;strcmp等相应的函数操作输入输出参数,尽量使用strncpy,&nbsp;memcpy等含有处理长度参数的函数进行处理。<br/>必须先分配系统资源,才能分配函数内部需要的资源;相反,必须首先释放函数内部分配的资源,再释放系统资源。<br/>3.2.4&nbsp;返回值<br/>对外接口API必须返回返回值给应用。<br/>4.&nbsp;错误和异常处理规范<br/>4.1&nbsp;出错类型定义约定<br/>在整个系统软件产品的出错定义要一致;<br/>统一模块层次的出错类型统一定义;<br/>出错类型分为错误、警告、提示等三类信息,分别用E、W、I开头;<br/>错误代码统一用宏描述,并且放在一个头文件中;<br/>出错代码的宏定义还要加注对这个代码的说明;<br/>出错代码有相应的文档指明代码的定义规则。<br/>例子:有ErrorDef.h中有如下定义:<br/>//&nbsp;**************************************************************<br/>//&nbsp;Error&nbsp;Code&nbsp;Macro&nbsp;Define<br/>//&nbsp;**************************************************************<br/>//&nbsp;Error&nbsp;Code<br/>#define&nbsp;E_OK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;没有错误<br/>#define&nbsp;E_NO_ENOUGH_MEMORY&nbsp;&nbsp;&nbsp;&nbsp;0x1001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;内存不足<br/>#define&nbsp;E_INVALID_HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x1002&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无效的句柄 <p></p><p>//&nbsp;Warning&nbsp;Code<br/>#define&nbsp;W_CUT_RECV_DATA 0x2001&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;裁剪接收数据<br/>#define W_ FIND_OLD_MESSAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x2002&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发现老的消息</p><p>//&nbsp;Information&nbsp;Code<br/>#define&nbsp;I_SEND_SUCCEED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x9001&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送成功<br/>注意:出错类型的定义一定要统一,并且一定要注意编码问题。<br/>4.2异常的捕获<br/>在程序中会出现各种异常,如除0错误、内存错误都要处理。要有异常可能的都要捕获。<br/>4.3异常和错误的处理<br/>每个函数独立处理内部的异常,对影响结果的异常通过返回值返回。对于在函数内部不能处理的异常,捕获后已另外的形式向调用者抛出,但是要在接口文档中详细写明。<br/>注意:处理异常一般有两种方法,一是通过将异常转化为另一个异常抛出,二是通过函数返回值返回。在本规范中,我们倾向于用第二种方法。<br/></p>
页: [1]
查看完整版本: [转帖]C/C++语言编码规范,在您进行编码之前应该阅读的规范(For beginner)