C语言代码规范

C语言代码规范
C语言代码规范

曙光信息产业(北京)有限公司

SBB项目组

C语言代码规范

注:“草稿”状态的文档版本为0.Y.Z,Y≥0,Z>0,Y、Z的数值不断累加;

“正式发布”状态的文档版本为X.Y,X≥1,Y≥0,且X、Y值不断累加;

“正在修改”状态的文档指对“正式发布”后的文档进行修改,文档版本为X.Y.Z,其中X.Y同修改之前的文档版本号,Z>0,Z的数值不断累加。

1排版

1.1文件

◆头文件要和实现文件分离,头文件要用#ifdefine #define #endif避免多次包含。

◆文件开头要给出文件的功能、修改历史记录等信息。

◆文件内容的排版顺序为:文件头,包含文件(先写标准路径,再写当前路径),宏定义,数据结构定义,全局变量,函数。

1.2文件内容分段

一个文件中包含多类内容,每类内容作为一段放在一起,每段之前用长串“/////”标明。

1.3缩进

◆有层次结构的地方,包括函数或过程的开始、结构的定义及循环、判断、case语句中的代码都要

采用缩进。

◆每层缩进4个空格,注意不要用tab代替4个空格。

1.4空行

◆必须空行的地方包括:

A.文件头与文件正文之间;

B.每两个函数的实现之间;

C.一个函数内部结构相对独立的代码段之间。

1.5空格

◆在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),不应加空格。

说明:采用这种松散方式编写代码的目的是使代码更加清晰。

由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中(比如函数名和括号之间)没有必要再留空格。

◆不要用tab代替空格(一般编辑器中都可以配置不用tab),以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐。

1.6换行

◆if、else、for、do、while、case、switch、default等语句自占一行,且if、for、do、while

◆较长的语句(一般>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。

◆循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作

1.7函数实现

◆函数内部的代码结构顺序是:

A.局部变量声明(如果有局部变量);

B.参数合法性检查(如果函数是API接口);

C.变量初始化(需要赋初始值的局部变量,都在这一段初始化,不要在声明的同时赋值)。

D.实现代码。

2命名

命名的一个重要原则是望文知意(其他人看到函数名就大体知道函数功能),特别是函数的命名,必须考

下面是一些通用规则

(1)文件名:用带下划线的小写方式,比如handle_file.c。

(2)函数名:用带下划线的小写方式,一般用两个单词。函数名形式为:模块名(可选)+动词+名词或形容词(可选),如set_rule,get_report,is_valid等。

(3)变量名:变量名采用形式为:名词,或修饰词+名词,如int count, intrule_num,char *content_rule。

(4)预定义的常量:用有下划线的大写方式,如MAX_RULE_NUM。

(5)编译开关/头文件等特殊应用,使用_EXAMPLE_TEST_之类以下划线开始和结尾的定义,其他预定义不

(6)缩写:变量命名尽量不使用单词缩写,如果单词太长必须缩写,应该省略其中的元音字母,以便望文知意,如packet_header缩写为pkt_hdr,而不要缩写为pack_h。

(7)全局变量:慎用全局变量,为明显标识全局变量,其命名采用glob_为前缀,如:glob_rule_handler。(8)用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

说明:下面是一些在软件中常用的反义词组。

add / del begin / end init / destroy init/remove

insert / delete alloc / free get/set

put / get lock / unlock open / close

min / max old / new start / stop

3注释

使用doxygen可以识别的“///”方式(流程结构使用),和"//"方式(代码细节使用)。注释质量的评价标准是doxygen生成的文档的质量,因此,程序员在提交代码前,必须用doxygen生成文档,检查注释是否勾勒出了程序的流程和框架,由注释生成的详细设计文档是否完备。

注释使用utf-8编码的中文字符,如果使用windows系统,注意编辑器的编码。

文件头必须有块注释说明文件的内容,作者,修改记录等信息。

对于复杂的函数流程,需要在函数之前的注释块中说明函数流程。

对于较简单的顺序结构的函数流程,函数内部的实现过程可以用"///" 注释说明。

对于嵌套结构,通过在内层注释中加破折号表示层次嵌套关系。

3.1每个函数都要在函数之前给出注释信息

◆功能说明。

◆返回值说明。

◆输入参数列表说明。(可选,函数功能明确,参数很少很简单时可省略,如果有控制参数,则必须说明)。

◆输出参数列表说明。(可选,如果有输出参数,则必须说明)。

◆与其它代码依赖关系。(可选,如果该函数与其他文件中的函数有复杂的调用关系,则必须说明)

3.2程序内复杂的代码段之前需要给出注释,下列情况被认为是复杂代码

◆根据特定问题,自己设计的算法或操作过程。

◆多层嵌套定义的数据结构。

◆一个逻辑段的代码行数超过50行(大约两屏),应该给出该段功能的注释。

◆一个嵌套结构的嵌套层次超过3层,应该给出嵌套内容的注释。

3.3代码细节尽量采用单行注释格式“//”,“/*...*/”格式用于调试过程中注释整块大段代码。

3.4注释单独成行,放在被注释模块之前,并与被注释模块缩进层次相同,并于注释之前的

代码用空行隔开。

3.5数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加

以注释。对数据结构的注释应放在其上方相邻位置;对结构中的每个域的注释放在此域的右方,用"///<"格式注释。

3.6多层嵌套代码结构中,程序块的结束行右方加注释标记,以表明某程序块的结束。

3.7需要特别注意的代码注释,使用doxygen的注释命令。

3.8代码框架和流程的注释,在代码开发之前的详细设计时书写,保证详细设计的可读性。

3.9代码实现细节的注释在写代码时边写代码边注释,修改代码同时修改相应的注释,以保

证注释与代码的一致性。

3.10调试过程中的打印信息,注释信息,调试完成不再使用时,要及时删除,保证定版代码

的整洁性。

4模板

4.1头文件模板

4.2实现文件模板

相关主题
相关文档
最新文档