
C语言编码规范.doc
13页第 1 页 C语言编码规范第 2 页 文档修改记录版本 版本日期 说明 编写者 审核者V0.1 吕晓敏第 3 页 1 排版规则1) 程序应采用缩进风格编写,每层缩进使用一个制表位(TAB) ,类定义、方法都应顶格书写;2) 源程序建议使用英文书写,尽量不含有中文每行不超过 80字符对于较长的语句(>80 字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读;循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分;3) 左花括号要另起一行,不能跟在上一行的行末;4) 一个变量定义占一行,一个语句占一行;5) 对独立的程序块之间、变量说明之后必须加空行;6) 在结构成员赋值等情况,等号对齐,最少留一个空格;7) 若函数或过程中的参数较长,则要进行适当的划分8) 形参的排序风格: 最常使用的参数放在第一位; 输入参数列表应放在输出参数列表的左边; 将通用的参数放在特殊的参数的左边2 命名规范2.1 应用程序的命名“系统简称”+模块名称2.2 子模块的命名每个子模块的名字应该由描述模块功能的 1-3以单词组成。
每个单词的首字母应大写在这些单词中可以使用一些较通用的缩写2.3 变量的命名变量的命名的基本原则是使得变量的含义能够从名字中直接理解可以用多个英文单词拼写而成,每个英文单词的首字母要大写,其中英文单词有缩写的可用缩写;变量的前缀表示该变量的类型;对于作用域跨越 10行以上的变量名称不能少于 4个字符,除循环变量,累加变量外不得使用 I、j、k 等名称的变量变量分为取全局变量和局部变量,对于全局变量以加前缀“g_” 来区分使用有意义的英语单词,使用大小写分隔,每个单词的第一个字母为大写标识符种类 书写规范 示 例函数/过程名/变量 一般标识符 CheckButtonStates宏标识符 大写标识符 SALES_TAX类型定义 ‘T’+一般标识符 TMyType类标识符 ‘C’+一般标识符 CEditBox结构标识符 ‘S’+一般标识符 SMyStructure联合标识符 ‘U’+一般标识符 UMyUnion第 4 页 字符标识符 ‘c’+一般标识符 cReadKey字符串标识符 ‘s’+一般标识符 sComputerName整数标识符 ‘i/ui/l/ul’+一般标识符iNumber, ulCurrent浮点型标识符 ‘f/d’+一般标识符 fPrice,dMoney逻辑标识符 ‘b’+一般标识符 bIsDetailed对象标识符 特征小写字母+一般标识符fMyStatus, tMyTree指针变量 p+类型前缀+一般标识符piCount全局变量 g+类型前缀+一般标识符giCount类私有变量 f+类型前缀+一般标识符fiCount数据库变量 以 m打头 miCount考虑到习惯性和简洁性,对于按常规使用的局部变量允许采用极短的名字,如用n、i 作为循环变量,p、q 作为指针等。
另外,要注意的是:全局变量在程序中不要定义太多,能用局部变量的就用局部变量如果要使用相关的变量,建议采用类的方式或者结构的方式存放,以减少具体变量的个数 2.4 常量的命名常量所有的字母均为大写并且单词之间使用下划线”_” 隔开2.5 函数/过程的命名函数/过程名称应该尽量使用能够表达函数功能的英文名称,函数名称中应该禁止使用如同 function1,function2等含义不清的名称单词间应该使用大小写分隔全局函数/过程名称以“g_”前缀开始2.6 接口命名接口名称要以大写字母开头如果接口包含多个单词,每个单词的首字母大写,其他字母小写,如果,这些单词是缩略语(例如 XML) ,也要首字母大写,其他字母小写(写为 Xml)2.7 类的命名类名称要以大写字母开头;类名称如果包含多个单词,每个单词的首字母要大写,其他字母小写;如果这些单词是缩略语(例如 XML) ,也要首字母大写,其他字母小写(写作 Xml) ;类名称应该是一个名词或名词短语;类成员变量的命名规则与上述规则相同,但是要以“m_” 开始,表示其为成员变量(Member) ;类名称不能出现下划线2.8 方法的命名方法名称以小写字母开头。
第 5 页 方法名称如果包含多个单词,除了第一个单词外,每个单词的首字母大写,其它字母小写如果这些单词是缩略语(例如 XML) ,也要首字母大写,其它字母小写(写作Xml) 方法名称应该是一个动词或动名词短语,意思是“完成什么功能” , “执行什么操作”2.9 数据库的命名2.9.1 表:采用“模块名简称+前缀+’_’+表名”的命名规则表名以能理解该表的内容为原则,可由中文表示,也可由代表此表含义的英文字母组成;首字母大写;前缀代表此表类别2.9.2 视图:采用“模块名+’_’+视图名+ ’视图’”的命名规则,通常由 8个以内汉字组成2.9.3 存储过程:采用“Proc+模块名+’_’+存储过程名 ”的命名规则2.9.4 触发器:采用“模块名+’_’+触发类型 +’_’+表名”的命名规则,如果有多个触发类型,则可以叠加在一起2.9.5 字段:字段的命名以能理解该字段的含义为原则,通常由多个英文单词加前缀拼写而成,而组成字段名称的首字母应大写单词有缩写的可用缩写字段的前缀表示该字段的数据类型,其取值详见“数据类型 ”描述原则上,字段的命名长度不超过 18字节;描述字段的中文名称,用数据库创建工具设计数据库时,需要输入。
3 参数的约定3.1 输入参数的约定有些函数有输入参数,这些参数指由函数外部(调用者)输入,并在函数内部使用在函数业务流程说明后跟输入参数说明区,用“ 输入参数” 或“Input Parameters”标记在参数名列表中的每个参数后增加该参数的注释3.2 输出参数的约定有些函数有输出参数,这些参数指由函数外部(调用者)定义,在函数内部使用并返回给调用者的参数在输入参数说明区后跟输出参数说明区,用“输出参数” 或 “Output Parameters”标记在参数名列表中的每个参数后增加该参数的注释另外输出参数一般以指针或应用输出第 6 页 3.3 返回值的约定每个函数均有返回值,除非操作非常简单对于有不同状态的返回值,建议用long型的返回值,0 为成功对于出错类返回值,在同一层次的模块,用统一代码表示在输出参数说明区后跟返回值说明区,用“返回值 ”或“Return values”标记返回值说明,要说明各种不同类型返回值以及它们的含义4 注释约定在软件中对每个文件头,自定义函数和变量,重要的处理过程都要有必要的注释4.1 源程序头的注释和规范每个源程序(包括存储过程)必须有头部说明、版本说明和函数结构三个部分:源程序头部说明FileName:Copy Right: System:Module:Function: See also: Author:Create Date:本程序的外部名字(如 *.prg, *.cpp)xxx公司 版权所有 版本信息本文件所在的系统或工程的名字本文件所在的功能模块名称 简要说明本程序的功能相关详细设计文档号编码人员创建日期源程序版本说明Editor:Version:Edit Date:修改人员 版本号修改日期4.2 函数头的注释和规范Name:Function:Input:Output:Return:Syntax:Env:Calling:函数名称简述函数或过程的功能[参数 1] - [说明…][参数 2] - [说明…][参数 1] - [说明…][参数 2] - [说明…][返回码 1] - [说明…][返回码 2] - [说明…]调用语法(可选)环境要求和影响(可选的)被调用的函数(可选的)4.3 变量注释直接在变量后面注明变量的用途和取值约定,例如:int status; //记录处理状态,0: 成功,1: 错误第 7 页 4.4 类型定义注释指类和记录等等定义的注释。
在注释中标明定义的用途4.5 区的注释同一个类的成员方法要求排列在一起,共同协作而实现同一个功能的函数和过程要求排列在一起代码通常使用几个函数和过程来实现某一项功能,这时候需要使用区注释将这些具有共同目的的函数和过程标明出来使用整行的”*”作为隔离行,让程序清晰可读一般删除的代码不建议直接删除,最好用“//” 注释起来4.6 代码中的注释在代码中要求注释的地方有: 代码中的关键部分; 在使用特殊算法或者逻辑性较强的代码; 在修改或删除代码部分,需要加注释;修改/删除人,目的5 变量的作用范围尽量做到缩小变量的作用范围,对于变量是指针的,应遵循以下约定: 在局部分配的空间在局部释放 函数体内不能分配空间并将空间指针作为函数参数返回 动态全局空间在程序结束时一定要释放 所有动态分配的空间在对应层次的模块释放,并且用完马上释放不重复释放相同的指针6 函数/过程的定义在函数的定义处应当增加本函数的功能描述的注释用一句话描述清楚功能可用英文或中文功能注释格式要求所有代码一致7 函数业务流程的定义在函数功能描述后,要增加函数的主要业务流程注释可以用多行描述,以解释清楚业务流程为主可用英文或中文。
业务流程注释格式要求所有代码一致业务流程注释可以尽量详细,注释的长度可以与代码长度差不多,但是不要太长比如处理 N阶乘的函数业务流程定义如下:/* Process: N factorial use callback function to implement. If N == 0 then */ /* return 1 else return N-1 factorial. */或/* 过程:N 阶乘利用回调函数实现如果 N等于零,则返回 1, *//* 否则返回 N-1 的阶乘 */第 8 页 注意:函数业务流程的说明并不在乎有多长,但是在乎能否说明过程有些像 N阶乘的函数流程比较简单,但是有些比较复杂当比较复杂时,可以用标号来说明8 接口/函数过程调用的约定8.1 头文件(.h 文件)提供给使用 API的应用的标准 C头文件头文件必须包含三部分1) 防止头文件重复引用的编译条件,即我们在创建头文件时必须增加以下的条件编译:#ifndef #define #endif比如要防止 abcqueue.h头文件被重复引用,必须在abcqueue.h增加以上的条件编译:#ifndef _ABCQUEUE_H#define _SMBUS_H……#endif2) 函数定义函数的定义是为了方便应用知道 LIB、DLL 里引出了怎样的 API,应该如何使用。
如上面的例子3) 错误代码定义错误代码是接口 API里因为内部某种错误返回的代码,它告诉应用出现了什么错误,以便开发者进行调试和排错8.2 函数8.2.1 函数体书写规范8.2.1.1 格式化要求每个函数代码行数应控制在 400行内(不包含注释)用缩行显示程序结构,缩进量统一使用 4个空格循环、分支层次不要超过五层 括号风格采用列对齐方式,即“{”与相匹配的“}”在同一列对齐,如:if ( … ){…}而不是:if ( … ) {…}函数参数定义采用现代风格,如:第 9 页 int main(int argc, char * argv[])而不是:int main(argc, argv)int argc;char * argv[];如果包含在条件判断和循环体中的内容比较多,结束时说明匹配的条件:if (a != b){……} /* end if (a != b)*/8.2.1.2 合理使用空格合理使用空格分隔语句中的各种元素,使源程序舒展,可读: 运算符两边加空格; ‘:’、’,’ 后跟空格;‘if’、 ‘for’等关键字后跟空格;两个函数之间至少留一空行8.2.1.3 表达式的。












