腾讯集团管理标准GL/YF014-2007V1.0-L1C++编码规范2007-10-25发布2007-10-25实施———————————————————————————————————腾讯集团发布GL/YF014-2007V1.0-L1前言本标准系公司首次发布实施,主要针对公司所有软件产品源代码范围的C和C++编码风格,对C和C++文件的版式、注释、标识符命名、可读性、变量、结构、函数和过程等方面均作出规范,以保障公司项目代码的易维护性和编码安全性。本标准由研发管理部、即时通信产品部共同制定。本标准主要起草人:Junjun(张莉珺)、qingming(王清明)、tracy(周银燕)本标准主要审核人:anwenfeng(冯文信)、paulinesong(宋虹漫)、ericlin(林松)、stevezheng(郑全战)、echouzhou(周立)、polo(陈广域)、leon(郭凯天)本标准批准人:jeffxiong(熊明华)、charles(陈一丹)、tony(张志东)、ponyma(马化腾)本标准首次发布日期:2007年10月25日本标准发送部门:公司各部门GL/YF014-2007V1.0-L12C++编码规范1目的为形成公司统一的C++编码风格,以保障公司项目代码的易维护性和编码安全性,特制定本规范。2适用范围本标准适用于腾讯集团(含分公司等各级分支机构)所有使用C和C++作为开发语言的软件产品。本标准中“腾讯集团”是指腾讯控股有限公司、其附属公司、及为会计而综合入账的公司,包括但不限于腾讯控股有限公司、深圳市腾讯计算机系统有限公司、腾讯科技(深圳)有限公司、腾讯科技(北京)有限公司、深圳市世纪凯旋科技有限公司、时代朝阳科技(深圳)有限公司、腾讯数码(深圳)有限公司、深圳市财付通科技有限公司。3总体原则所有使用C和C++作为开发语言的软件产品都须遵照本规范的内容进行编码。4程序的版式4.1规则:程序块要采用缩进风格编写,缩进的空格数为4个。说明:由开发工具自动生成的代码可能不一致,但如果开发工具可以配置,则应该统一配置缩进为4个空格。4.2规则:缩进或者对齐只能使用空格键,不可使用TAB键。说明:使用TAB键需要设置TAB键的空格数目是4格。GL/YF014-2007V1.0-L134.3规则:相对独立的程序块之间、变量说明之后必须加空行。说明:以下情况应该是用空行分开:1)函数之间应该用空行分开;2)变量声明应尽可能靠近第一次使用处,避免一次性声明一组没有马上使用的变量;3)用空行将代码按照逻辑片断划分;4)每个类声明之后应该加入空格同其他代码分开。示例:4.4规则:较长的语句(80字符)要分成多行书写。说明:以下情况应分多行书写:1)长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。2)若函数或过程中的参数较长,则要进行适当的划分。3)循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。示例:如下例子不符合规范。if(!valid_ni(ni)){...//programcode}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;应如下书写:if(!valid_ni(ni)){...//programcode}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;GL/YF014-2007V1.0-L14perm_count_msg.head.len=NO7_TO_STAT_PERM_COUNT_LEN+STAT_SIZE_PER_FRAM*sizeof(_UL);act_task_table[frame_id*STAT_TASK_CHECK_NUMBER+index].occupied=stat_poi[index].occupied;act_task_table[taskno].duration_true_or_false=SYS_get_sccp_statistic_state(stat_item);report_or_not_flag=((tasknoMAX_ACT_TASK_NUMBER)&&(n7stat_stat_item_valid(stat_item))&&(act_task_table[taskno].result_data!=0));n7stat_str_compare((BYTE*)&stat_object,(BYTE*)&(act_task_table[taskno].stat_object),sizeof(_STAT_OBJECT));n7stat_flash_act_duration(stat_item,frame_id*STAT_TASK_CHECK_NUMBER+index,stat_object);if((tasknomax_act_task_number)&&(n7stat_stat_item_valid(stat_item))){...//programcode}for(i=0,j=0;(iBufferKeyword[word_index].word_length)&&(jNewKeyword.word_length);i++,j++){...//programcode}for(i=0,j=0;(ifirst_word_length)&&(jsecond_word_length);`i++,j++){...//programcode}GL/YF014-2007V1.0-L154.5规则:不允许把多个短语句写在一行中,即一行只写一条语句。说明:一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。示例:4.6规则:if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。示例:4.7规则:代码行之内应该留有适当的空格说明:采用这种松散方式编写代码的目的是使代码更加清晰。代码行内应该适当的使用空格,具体如下:1)关键字之后要留空格。象const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。2)函数名之后不要留空格,紧跟左括号’(’,以与关键字区别。3)‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。4)‘,’之后要留空格,如Function(x,y,z)。如果‘;’不是一行的结束符号,其如下例子不符合规范。if(pUserCR==NULL)return;应如下书写:if(pUserCR==NULL){return;}如下例子不符合规范rect.length=0;rect.width=0;应如下书写rect.length=0;rect.width=0;GL/YF014-2007V1.0-L16后也要留空格,如for(initialization;condition;update)。5)值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“=”、“=”、“+”、“*”、“%”、“&&”、“||”、“”、“^”等二元操作符的前后应当加空格。6)一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。7)象“[]”、“.”、“-”这类操作符前后不加空格。示例:4.8建议:程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。示例:应该按照以下的格式书写:voidfoo(){„//programcode}if(i==0){„//programcode}foo-bar,foo.bar,foo[bar]i++,!i,&ii+=9,a*bGL/YF014-2007V1.0-L175注释5.1规则:源文件头部应进行注释,列出:生成日期、作者、模块目的/功能等。示例:下面这段源文件的头注释比较标准,可以不局限于此格式,但上述信息要包含在内。说明:Description一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它/************************************************************FileName:test.cppAuthor:Version:Date:Description://模块描述Version://版本信息FunctionList://主要函数及其功能1.-------History://历史修改记录authortimeversiondescDavid96/10/121.0buildthismoudle***********************************************************/如下例子不符合规范。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}应如下书写。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}GL/YF014-2007V1.0-L18文件关系等。History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。也可以采用javadoc风格的文档注释,这里不再举例,下同。5.2规则:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值等。示例:下面这段函数的注释比较标准,可以不局限于此格式,但上述信息要包含在内。5.3规则:注释应该和代码同时更新,不再有用的注释要删除。5.4规则:注释的内容要清楚、明了,不能有二义性。说明:错误的注释不但无益反而有害。5.5建议:避免在注释中使用非常用的缩写或者术语。5.6建议:注释的主要目的应该是解释为什么这么做,而不是正在做什么。如果从上下文不容易看出作者的目的,说明程序的可读性本身存在比较大的问题,应考虑对其重构。5.7建议:避免非必要的注释。例如:/*************************************************Description://函数功能、性能等的描述Input://输入参数说明,包括每个参数的作//用、取值说明及参数间关系。Output://对输出参数的说明。Return://函数返回值的说明Others://其它说明*************************************************/GL/YF014-2007V1.0-L195.8规则:注释的版式说明:注释也需要与代码一样整齐排版1)注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。2)注释与所描述内容进行同样的缩排。3)将注释与其上面的代码用空行隔开。4)变量、常量、宏的注释应放在其上方相邻位置或右方。示例:如下例子不符合规范。例1:注释在代码行之下repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;/*getreplicatesubsysteminde