C++编码规范.docx
《C++编码规范.docx》由会员分享,可在线阅读,更多相关《C++编码规范.docx(30页珍藏版)》请在冰豆网上搜索。
C++编码规范
C++编码标准
Lt
D
1. 命名规那么
1.1.起个适宜的名字
1.1.1. 类的名称〔适用于C++〕
² 类的名称要能告诉我们,这个类是什么。
因此,类的名称通常是名词。
² 类的名字不需要告诉我们,它从哪个类继承而来的。
² 有时候加个后缀是很有用的。
比方类是一个代理(Agents)时,起名叫DownloadAgent更能表达真实的意图。
1.1.2. 方法和函数的名称〔适用于C/C++〕
² 方法和函数通常都要执行某种行为,因此,名称要能清楚的说明它做什么:
CheckForErrors()而不是ErrorCheck(),DumpDataToFile()而不是DataFile()。
这样也可以很容易的区别函数和数据。
² 函数名总以动词开头,后面跟随其它名称。
这样看起来更自然些。
² 可以加一些必要的后缀:
Max–表示取最大值
Cnt–表示当前的计数值
Key–表示键值
例如:
RetryMax表示可接收的最大数,RetryCnt表示当前接收的数量。
² 前缀也同样有用:
Is–用于询问一些问题。
只要看到Is开头,就知道这是一个查询。
Get–用于获取一个值。
Set–用于设置一个值。
例如:
IsHitRetryLimit.
1.1.3. 含有度量单位的名称〔适用于C/C++〕
² 如果一个变量用于表示时间,重量或其它度量单位,应把度量单位添加到名称中,以便开发人员更早一步发现问题。
例如:
uint32mTimeoutMsecs;
uint32mMyWeightLbs;
1.1.4. 缩写名称不要全部大写〔适用于C/C++〕
² 无论是什么缩写名称,我们总以一个大写字母开头,后面跟随的字母全部用小写。
例如:
classFluidOz; //而不是FluidOZ
classNetworkAbcKey; //而不是NetworkABCKey
1.2.类的命名〔适用于C++〕
² 用大写字母作为单词的分隔,每个单词的首字母大写,其它字母均小写。
² 名字的第一个字母应大写
² 不含有下划线('_')
例如:
classNameOneTwo;
className;
1.3.类库〔或程序库〕命名〔适用于C/C++〕
² 使用命名空间防止名字冲突。
² 如果编译器没有实现命名空间,需要用前缀来避名名字冲突,不过前缀不要过长〔2个字母比拟好〕。
例如:
JohnJohnson完成了一个数据结构的库,它可以使用JJ作为库的前缀,所以类名就象下面这样:
classJjLinkList
{
}
1.4.方法和函数的命名〔适用于C++〕
² 使用与类名相同的规那么
例如:
classNameOneTwo
{
public:
int DoIt();
void HandleError();
}
1.5.类属性的命名〔适用于C++〕
² 属性〔通常是非公有数据成员〕名字以字母'm'开头。
² 在'm(m_)' 后面,使用与类名相同的规那么。
² 'm(m_)'总是位于其它修饰符〔如表示指针的'p'〕的前面。
例如:
classNameOneTwo
{
public:
int VarAbc();
int ErrorNumber();
private:
int mVarAbc;
int mErrorNumber;
String* mpName;
}
1.6.方法和函数参数的命名〔适用于C++〕
² 第一个字母必须小写。
² 第一个字母后面的单词使用与类名相同的规那么。
例如:
classNameOneTwo
{
public:
int StartYourEngines(
Engine&rSomeEngine,
Engine&rAnotherEngine);
}
1.7.局部变量的命名〔适用于C/C++〕
² 所有字母都用小写
² 使用下划线'_'作为单词的分隔。
例如:
int
NameOneTwo:
:
HandleError(interrorNumber)
{
int error=OsErr();
Time time_of_error;
ErrorProcessorerror_processor;
}
1.8.指针变量的命名前缀〔适用于C/C++〕
² 指针变量多数情况应在前面加'p'。
² 星号'*'应靠近类型,而不是变量名。
例如:
String*pName=newString;
特别的:
String*pName,name;应分成两行来写:
String*pName;
String name;
1.9.引用变量和返回引用函数的命名前缀〔适用于C++〕
² 引用必须用'r'作前缀修饰。
例如:
classTest
{
public:
void DoSomething(StatusInfo&rStatus);
StatusInfo& rStatus();
constStatusInfo& Status()const;//这里返回的是常量引用,所以不符合本规那么
private:
StatusInfo& mrStatus;
}
1.10. 全局变量的命名前缀〔适用于C/C++〕
² 全局变量总是以'g(g_)'作为前缀。
例如:
Logger g_Log;
Logger*g_pLog;
1.11. 全局常量的命名〔适用于C/C++〕
² 全局常量全部大写,并以下划线'_'分隔单词。
例如:
constintA_GLOBAL_CONSTANT=5;
1.12. 静态变量的命名前缀〔适用于C++〕
² 静态变量以's'作为前缀。
例如:
classTest
{
public:
private:
staticStatusInfom_sStatus;
}
1.13. 自定义类型〔typedef〕的命名〔适用于C/C++〕
² 类型定义名称指的是用typedef定义的名称。
² 类型定义名称使用与类名相同的规那么,并使用Type作为后缀。
例如:
typedefuint16 ModuleType;
typedefuint32 SystemType;
1.14. 宏定义的命名〔适用于C/C++〕
² 所有单词的字母都用大写,并使用下划线'_'分隔.
例如:
#defineMAX(a,b)blah
#defineIS_ERR(err)blah
1.15. C函数的命名〔适用于C/C++〕
² C++工程中,应尽量少用C函数。
² C函数使用GNU标准,所有字母都使用小写,并用下划线'_'作为单词的分隔。
例如:
int
some_bloody_function()
{
}
² 特别的,为了赚容C/C++,在必要的时候,在C++中应以下面的格式定义C函数:
extern“C〞intsome_bloody_function();
² 或在C/C++中推荐使用下面的格式:
#ifdef__cplusplus__
extern“C〞{
#endif
int
some_bloody_function()
{
}
#ifdef__cplusplus__
}
#endif
1.16. 枚举的命名〔适用于C/C++〕
² 所有字母都大写,并用下划线'_'作为单词分隔。
例如:
enumPinStateType
{
PIN_OFF,
PIN_ON
};
enum{STATE_ERR, STATE_OPEN,STATE_RUNNING,STATE_DYING};
2. 排版规那么
2.1.布局和模板
2.1.1. 类的布局模板〔适用于C++〕
² 请使用下面的模板来创立一个新的类:
/**
* 用一行来描述类
*
*#include"XX.h"
*-llib
*
* 类的详细说明
*
*@seesomething
*/
#ifndef SORUTION_PROJECT_CLASSNAME_H
#define SORUTION_PROJECT_CLASSNAME_H
// 在这里包含系统头文件
//
// 在这里包含工程头文件
//
// 在这里包含局部头文件
//
// 在这里放置前置引用
//
class XX
{
public:
// 类的生命周期控制函数,如构造和析构,以及状态机
/**
*Defaultconstructor.
*/
XX(void);
/**
*Copyconstructor.
*
*@paramfromThevaluetocopytothisobject.
*/
XX(const XX&from);
/**
*Destructor.
*/
virtual~XX(void);
// 在这里放置类的运算操作符
/**
*Assignmentoperator.
*
*@paramfromTHevaluetoassigntothisobject.
*
*@returnAreferencetothisobject.
*/
XX& operator=(XX&from);
// 在这里放置类的操作
// 在这里放置属性存取
// 在这里放置类的状态查询
protected:
private:
};
// 内联方法定义
//
// 外部引用
//
#endif // SORUTION_PROJECT_CLASSNAME_H
² 定义的顺序是:
public,protected,private
² 要清楚public/protected/private都应该放置哪些东西
2.1.2. 源文件格式〔适用于C++〕
#include "XX.h" //classimplemented
///////////////PUBLIC///////////////////////
//================= 构造函数====================
XX:
:
XX()
{
}//XX
XX:
:
XX(const XX&)
{
}//XX
XX:
:
~XX()
{
}//~XX
//=============== 操作符=========================
XX&
XX:
:
operator=(XX&);
{
return *this;
}//=
//==============类的操作=====================
//==============属性存取=====================
//==============状态查询 =====================
/////////////PROTECTED //////////////////
/////////////PRIVATE //////////////////
2.1.3. 保护头文件不被重复包含〔适用于C/C++〕
² 应使用宏定义来保护头文件不被重复包含:
#ifndef SORUTION_PROJECT_CLASSNAME_H
#define SORUTION_PROJECT_CLASSNAME_H
#endif // SORUTION_PROJECT_CLASSNAME_H
² 如果使用命名空间的时候,要把命名空间加到文件名前面:
#ifndef SORUTION_PROJECT_NAMESPACE_CLASSNAME_H
#define SORUTION_PROJECT_NAMESPACE_CLASSNAME_H
#endif
2.1.4. 方法和函数的布局〔适用于C/C++〕
² 对于有较多参数的函数的写法
如果参数较多,一行写不下,我们应该分成几行来写,并且每个参数都另起一行对齐:
int AnyMethod(
int arg1,
int arg2,
int arg3,
int arg4);或
int AnyMethod( int arg1
, int arg2
, int arg3
, int arg4);
2.2.缩进、制表符以及空格〔适用于C/C++〕
² 缩进的时候,每一层缩进3,4,或8个空格。
〔推荐使用4个空格〕
² 不要使用TAB,用空格,大多数编辑器可以用空格代替TAB。
TAB应固定4个空格,因为大多数编辑器都是这么设置的。
² 虽然没有规定缩进的层次,但是4至5层是适宜的。
如果缩进的层次太多,你可能需要考虑是否进行代码重构了。
例如:
void
func()
{
if (somethingbad)
{
if (anotherthingbad)
{
while (moreinput)
{
}
}
}
}
2.3.尽量使一行不要超过78个字母〔适用于C/C++〕
² 有许多编辑器屏幕只有78个字母宽
2.4.保证一行只写一条语句〔适用于C/C++〕
² 一行最多只写一条语句
² 一行只定义一个变量
例如:
不要象下面这样:
char**a,*x;
intwidth,height;//widthandheightofimage
要象这样:
char**a=0; //文档说明
char* x=0; //文档说明
2.5.花括号{}规那么〔适用于C/C++〕
2.5.1. 花括号的位置
² 在关键字的下一行单独放置括号,并且与关键字对齐,如:
if (condition)
{
...
}
while (condition)
{
…
}
2.5.2. 什么时候应使用花括号
所有的if,while和do语句,要么用单行格式,要么使用花括号格式。
² 使用花括号格式:
if(1==somevalue)
{
somevalue=2;
}
² 单行格式:
if(1==somevalue)somevalue=2;
或下面这样〔对于这种写法,建议使用花括号〕:
if(1==somevalue)
{
somevalue=2;
}
2.5.3. 在花括号结束的位置加上注释
² 在花括号结束的位置加上注释是一个好习惯。
假设前后花括号距离很远,注释就能帮你理解它是如何对应的。
如:
while
(1)
{
if (valid)
{
} //ifvalid
else
{
} //notvalid
} //endforever
2.5.4. 注意屏幕大小
² 一个语句块尽量不超过一个屏幕大小,这样,不要卷动屏幕就可以阅读代码。
2.6.圆括号()规那么〔适用于C/C++〕
² 圆括号与关键字之间应放一个空格。
² 圆括号与函数名之间不要有空格。
² Return语句不要使用圆括号。
例如:
if(condition)
{
}
while(condition)
{
}
strcpy(s,s1);
return1;
2.7.ifelse语句的格式〔适用于C/C++〕
² 布局
if(条件) //注释
{
}
elseif(条件) //注释
{
}
else //注释
{
}
² 条件格式
总是把常量放在等号或不等于号的左边:
if(6==errorNum)...
一个很重要的理由是,假设漏写一个等号,这种写法会产生一个编译错误,有助于马上发现问题。
比方:
if(errorNum==6)...
错写成:
if(errorNum=6)...//这是一个不容易发现的灾难
2.8.switch格式〔适用于C/C++〕
² 直通的case语句,应该放置一条注释说明这个case语句是直通到下一个case语句的。
² 总是要写default语句,不管是否是需要。
² 在case中需要定义变量的时候,应把所有代码放在语句块中。
例如:
switch (...)
{
case 1:
...
// 继续执行case2
case 2:
{
int v;
...
}
break;
default:
}
2.9.使用goto,continue,break和?
:
〔适用于C/C++〕
2.9.1. Goto
² 尽量防止使用Goto语句。
一个合理使用goto语句的场合是,当你需要从多层循环中跳出。
例如:
for (...)
{
while (...)
{
...
if (disaster)
goto error; //跳出循环
}
}
...
error:
cleanupthemess
² 跳转的标号必须单独在一行的最左边。
Goto语句需要有相应的注释,说明它的用途。
2.9.2. ContinueandBreak
² Continue和break实际上起到与goto一样的作用,因此,尽量少用为上。
并且,Continue与break最好不要连用。
2.9.3. ?
:
² 用括号把条件表达式括起来。
² 不要在?
:
中写上过多的代码,操作表达式应尽可能简洁。
² 操作语句应分行写,除非它们能够简洁的放在一行当中。
例如:
(condition)?
funct1():
func2();
或
(condition)
?
longstatement
:
anotherlongstatement;
2.10. 运算符号的规那么〔适用于C/C++〕
² 一元操作符如〔!
、~等等〕应贴近操作对象。
如:
if(!
IsOk)
return++v;
² 二元操作符如〔+、*、%、==等等〕应在前后留空格。
如:
if(v1==v2)
returnv1*3;
² ++和--尽量使用前置运算。
在C++中,不管++i还是i++,总是++i更容易生成优化代码。
如:
for(inti=0;i<10;++i)
2.11. 变量声明语句块〔适用于C/C++〕
² 变量应该是随用随声明,不要集中在函数前〔有些C语言不支持,那么不在此要求之列〕。
特别是在for语句的循环变量,应只在for语句中定义。
如:
for(inti=0;i<10;++i)
² 声明语句块必须要对齐
类型,变量,等号和初始化值要分别对齐。
例如:
DWORD mDword;
DWORD* mpDword;
char* mpChar;
char mChar;
mDword = 0;
mpDword = NULL;
mpChar = NULL;
mChar = 0;
3. 文档及注释
应当使用文档自动生成工具,来生成相关的程序文档。
3.1.文件或程序库的文档注释〔适用于C/C++〕
可以为整个文件编写文档。
例如:
/**@filefile.h
*Abrieffiledescription.
*Amoreelaboratedfiledescription.
*/
3.2.类文档注释〔适用于C/C++〕
在类定义前面应加上类说明文档。
例如:
/**WindowsNT
* @briefWindowsNiceTry.
* @authorBillGates
* @authorSeveralspeciesofsmallfurryanimalsgathered