C/C++语言编码规范
目录
C/C++语言编码规范.................................................................................................................. 1
1. 命名规则 ............................................................................................................................ 4
1.1. 起个合适的名字 ........................................................................................................4
1.1.1. 类的名称 ...................................................................................................... 4
1.1.2. 方法和函数的名称 ......................................................................................4
1.1.3. 含有度量单位的名称 ....................................................................................4
1.1.4. 缩写名称不要全部大写 ..............................................................................4
1.2.类的命名 ...................................................................................................................... 4
1.3.类库(或程序库)命名 ..............................................................................................5
1.4.方法和函数的命名 ......................................................................................................5
1.5.类属性的命名 ..............................................................................................................5
1.6.方法和函数参数的命名 ..............................................................................................5
1.7.局部变量的命名 ..........................................................................................................6
1.8.指针变量的命名前缀 ..................................................................................................6
1.9.引用变量和返回引用函数的命名前缀 ......................................................................6
1.10. 全局变量的命名前缀 ............................................................................................. 6
1.11. 全局常量的命名 ..................................................................................................... 7
1.12. 静态变量的命名前缀 ............................................................................................. 7
1.13. 自定义类型(typedef)的命名 ............................................................................ 7
1.14. 宏定义的命名 ......................................................................................................... 7
1.15. C 函数的命名......................................................................................................... 7
1.16. 枚举的命名 ............................................................................................................. 8
2. 排版规则 ............................................................................................................................ 8
2.1. 布局和模板 ................................................................................................................8
2.1.1. 类的布局模板 .............................................................................................. 8
2.1.2. 源文件格式 .................................................................................................. 10
2.1.3. 保护头文件不被重复包含........................................................................11
2.1.4. 方法和函数的布局 ....................................................................................11
2.2. 缩进、制表符以及空格 ..........................................................................................11
2.3. 尽量使一行不要超过 78 个字母 ............................................................................12
2.4. 保证一行只写一条语句 ..........................................................................................12
2.5. 花括号 {} 规则 ....................................................................................................... 12
2.5.1. 花括号的位置 ............................................................................................12
2.5.2. 什么时候应使用花括号 ....................................................................................12
2.5.3. 在花括号结束的位置加上注释................................................................13
2.5.4. 注意屏幕大小 ............................................................................................13
2.6.圆括号 () 规则 ................................................................................................. 13
2.7.if else 语句的格式.................................................................................................... 13
2.8.switch 格式 ................................................................................................................14
2.9. 使用 goto,continue,break 和 ?: .............................................................................14
2.9.1. Goto............................................................................................................ 14
2.9.2.
Continue and Break.................................................................................... 15
?: ................................................................................................................. 15
2.10. 运算符号的规则 ................................................................................................... 15
2.11. 变量声明语句块................................................................................................. 15
3. 文档及注释...................................................................................................................... 16
3.1. 文件或程序库的文档注释 ......................................................................................16
3.2. 类文档注释 ..............................................................................................................16
3.3. 函数文档注释 ..........................................................................................................17
3.4. Include 语句注释..................................................................................................... 18
3.5.语句块注释 ................................................................................................................18
4. 编码要求 .......................................................................................................................... 18
4.1. 不要忽略编译器的警告 ..........................................................................................18
4.2. 应使用源代码管理器 ..............................................................................................18
4.3. 固有的类方法成员 ..................................................................................................18
4.4. 使用命名空间 ..........................................................................................................19
4.5. 初始化所有的变量 ..................................................................................................19
4.6. 保持函数短小精悍 ..................................................................................................19
4.7.对空语句进行注释 ....................................................................................................19
4.8. 不要用 if 语句的默认方法测试非零值................................................................. 19
4.9.布尔类型 ....................................................................................................................20
4.10. 避免在语句中内含赋值 .......................................................................................20
4.11. 正确的使用 Const.................................................................................................20
4.12. 不要在头文件定义数据 .....................................................................................20
4.13. 不要直接使用数字 ............................................................................................... 21
4.14. 宏......................................................................................................................... 21
5. SVN 使用规范 .......................................................................................................................22
2.9.3.
5.1. 先更新,再提交 ......................................................................................................22
5.2. 一个提交尽量对应一个逻辑问题 ..........................................................................22
5.3. 多提交 ......................................................................................................................22
5.4. 不要提交不能通过编译的代码 ..............................................................................23
5.5. 每次提交必须书写明晰的标注 ..............................................................................23
5.6. 对于不同类型的提交需要使用不同类型前缀作为标记 ..................................... 23
5.7. 提交时注意不要提交本地自动生成的文件 ......................................................... 23
5.8. 不要提交自己不明白的代码 ..................................................................................23
5.9. 慎用锁定功能 ..........................................................................................................23
5.10. 使用 TAG 功能为 release 版本做标记................................................................. 24
1. 命名规则
1.1. 起个合适的名字
1.1.1. 类的名称
类的名称要能告诉我们,这个类是什么。因此,类的名称通常是名词。
类的名字不需要告诉我们,它从哪个类继承而来的。
有时候加个后缀是很有用的。比如类是一个代理(Agents)时,起名叫 DownloadAgent 更
能表达真实的意图。
1.1.2. 方法和函数的名称
方 法 和 函 数 通 常 都 要 执 行 某 种 行 为 , 因 此 , 名 称 要 能 清 楚 的 说 明 它 做 什 么 :
CheckForErrors() 而不是 ErrorCheck(),DumpDataToFile() 而不是 DataFile()。 这样也可以很容
易的区别函数和数据。
函数名总以动词开头,后面跟随其它名称。这样看起来更自然些。
可以加一些必要的后缀:
Max – 表示取最大值
Cnt – 表示当前的计数值
Key – 表示键值
例如:RetryMax 表示可接收的最大数,RetryCnt 表示当前接收的数量。
前缀也同样有用:
Is – 用于询问一些问题。只要看到 Is 开头,就知道这是一个查询。
Get – 用于获取一个值。
Set – 用于设置一个值。
例如:IsHitRetryLimit.
1.1.3. 含有度量单位的名称
如果一个变量用于表示时间,重量或其它度量单位,应把度量单位添加到名称中,以便
开发人员更早一步发现问题。
例如:
uint32 mTimeoutMsecs;
uint32 mMyWeightLbs;
1.1.4. 缩写名称不要全部大写
无论是什么缩写名称,我们总以一个大写字母开头,后面跟随的字母全部用小写。
例如:
class FluidOz;
class NetworkAbcKey;
1.2.类的命名
用大写字母作为单词的分隔,每个单词的首字母大写,其它字母均小写。
名字的第一个字母应大写
不含有下划线 ('_')
例如:
// 而不是 NetworkABCKey
// 而不是 FluidOZ
class NameOneTwo;
class Name;
1.3.类库(或程序库)命名
使用命名空间防止名字冲突。
如果编译器没有实现命名空间,需要用前缀来避名名字冲突,不过前缀不要过长(2 个
字母比较好)。
例如:
John Johnson 完成了一个数据结构的库,它可以使用 JJ 作为库的前缀,所以类名就象
下面这样:
class JjLinkList
{
}
1.4.方法和函数的命名
使用与类名相同的规则
例如:
class NameOneTwo
{
public:
DoIt();
int
void HandleError();
}
1.5.类属性的命名
属性(通常是非公有数据成员)名字以字母'm'开头。
在 'm(m_)' 后面,使用与类名相同的规则。
'm(m_)' 总是位于其它修饰符(如表示指针的 'p')的前面。
例如:
class NameOneTwo
{
public:
int
int
VarAbc();
ErrorNumber();
private:
int
int
String*
mVarAbc;
mErrorNumber;
mpName;
}
1.6.方法和函数参数的命名
第一个字母必须小写。
第一个字母后面的单词使用与类名相同的规则。
例如:
class NameOneTwo
{
public:
int
StartYourEngines(
Engine&rSomeEngine,
Engine&rAnotherEngine);
}
1.7.局部变量的命名
所有字母都用小写
使用下划线 '_' 作为单词的分隔。
例如:
int
NameOneTwo::HandleError(int errorNumber)
{
error= OsErr();
time_of_error;
int
Time
ErrorProcessor error_processor;
}
1.8.指针变量的命名前缀
指针变量多数情况应在前面加 'p'。
星号 '*' 应靠近类型,而不是变量名。
例如:
String* pName=new String;
特别的:String* pName, name; 应分成两行来写:
String* pName;
String name;
1.9.引用变量和返回引用函数的命名前缀
引用必须用 'r'作前缀修饰。
例如:
class Test
{
public:
void
DoSomething(StatusInfo&rStatus);
StatusInfo&
constStatusInfo& Status() const; // 这里返回的是常量引用,所以不符合本规则
rStatus();
mrStatus;
private:
StatusInfo&
}
1.10. 全局变量的命名前缀
全局变量总是以 'g(g_)' 作为前缀。
例如:
Logger g_Log;
Logger* g_pLog;
1.11. 全局常量的命名
全局常量全部大写,并以下划线 '_' 分隔单词。
例如:
const intA_GLOBAL_CONSTANT = 5;
1.12. 静态变量的命名前缀
静态变量以 's' 作为前缀。
例如:
class Test
{
public:
private:
staticStatusInfo m_sStatus;
}
1.13. 自定义类型(typedef)的命名
类型定义名称指的是用 typedef 定义的名称。
类型定义名称使用与类名相同的规则,并使用 Type 作为后缀。
例如:
typedefuint16 ModuleType;
typedefuint32 SystemType;
1.14. 宏定义的命名
所有单词的字母都用大写,并使用下划线 '_' 分隔.
例如:
#define MAX(a,b) blah
#define IS_ERR(err) blah
1.15. C 函数的命名
C++项目中,应尽量少用 C 函数。
C 函数使用 GNU 规范,所有字母都使用小写,并用下划线 '_' 作为单词的分隔。
例如:
int some_bloody_function()
{
}
特别的,为了赚容 C/C++,在必要的时候,在 C++中应以下面的格式定义 C 函数:
extern “C” int some_bloody_function();
或在 C/C++中推荐使用下面的格式:
#ifdef__cplusplus__
extern “C”{
#endif
Int some_bloody_function()
{
}
#ifdef__cplusplus__
}
#endif
1.16. 枚举的命名
所有字母都大写,并用下划线 '_' 作为单词分隔。
例如:
enumPinStateType
{
PIN_OFF,
PIN_ON
};
enum { STATE_ERR, STATE_OPEN, STATE_RUNNING, STATE_DYING};
2. 排版规则
2.1. 布局和模板
2.1.1. 类的布局模板
请使用下面的模板来创建一个新的类:
/**
* 用一行来描述类
*
*#include "XX.h"
*-llib
*
* 类的详细说明
*
* @seesomething
*/
#ifndef SORUTION_PROJECT_CLASSNAME_H
#define SORUTION_PROJECT_CLASSNAME_H
// 在这里包含系统头文件
//
// 在这里包含项目头文件
//
// 在这里包含局部头文件
//
// 在这里放置前置引用
//