目 录
1 排版
2 注释
3 标识符命名
4 变量、结构
5 函数、过程
6 可测性
7 宏
1 排版
1-1:程序块的{}的写法。
示例:如下例子不符合规范。
for (int i=0; i<5; i++){
... // program code
}
应如下书写
for (int i=0; i<5; i++)
{
... // program code
}
1-2:函数和文件的大小控制
一般情况下,函数小于40行;
文件大小小于1000行。
1-3:头文件路径使用相对路径;头文件引用全部放在一个文件中。
1-4:include文件顺序
说明:文件路径必须使用相对路径;一般include文件的顺序如下(从左往右):
C system files; C++ system files; other libraries’ .h文件; your project’s .h文件
对于工程中使用到的支持stl的头文件,也放到比较高级的顺序中。
2 注释
2-1:一般情况下,源程序有效注释量必须在20%以上。
说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不
能太少,注释语言必须准确、易懂、简洁。
2-2:注释用中文即可。
说明:英文注释,不同人的注释理解不一样;语句比较杂乱,拼写错误比较多。
2-3:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有
用的注释要删除。
2-4:注释的内容要清楚、明了,含义准确,防止注释二义性。
说明:错误的注释不但无益反而有害。
2-5:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)
相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
示例:如下例子不符合规范。
例 1:
// 宽度
width = rect.width;
height = rect.height;
例 2:
width = rect.width;
height = rect.height;
// 高度
例 3:
void Init() // 初始化函数
{
...
}
应如下书写
width = rect.width; //宽度
height = rect.height; //高度
// 初始化函数
void Init()
{
...
}
3 标识符命名
3-1: 标识符的命名,遵循最小化、最短化原则。
说明:一般不超过4个字符,但能被区分识别;可以加上必要的注释;禁止使用单个字符(3-4)。
3-2:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的
缩写,避免使人产生误解。
说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成
缩写;一些单词有大家公认的缩写。
示例:如下单词的缩写能够被大家基本认可。
temp 可缩写为 tmp ;
flag 可缩写为 flg ;
statistic 可缩写为 stat ;
increment 可缩写为 inc ;
message 可缩写为 msg ;
3-3:命名中若使用特殊约定或缩写,则要有注释说明。
说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进
行必要的注释说明。
3-4:对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能
表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。
说明:变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i 写成j),而编
译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。
3-5:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,用作特殊
标识如标识成员变量或全局变量的m_和g_,其后加上小写的方式。
示例: m_Player 不允许, m_player 允许。
3-6:namespace命名:不能太长,力求简单、精巧明了、明了;不建议使用命名空间套用命名空间。
例:
建议:socket底层一个命名空间,协议一个命名空间。
协议的命名空间命名做到分类和区段划分,对不同区段定义不同的作用。
4 变量、结构
4-1:变量的定义遵循最小化、最短化原则。
4-2:变量的命名全部用小写;函数的命名首字母大写。
4-3:枚举的使用,一般定义为全局的。
4-4:局部变量,最小化方式定义。
示例:如下例子不符合规范。
例 1:
int i;
for (i=1; i<5; i++)
{
...
}
应如下书写
for (int i=1; i<5; i++)
{
...
}
4-5:类的命名:类定义一般首字母用C
示例:如下例子不符合规范
例:Class Player; Class _Player; Classplayer;
应如下书写
Class CPlayer
4-6:结构的定义:定义时有个统一的标识符,方便在类视图中查看。
示例(规范的书写):
typedef struct tagPlayInfo
{
...
}PLAYERINFO,*PPLAYERINFO;
5 函数、过程
5-1:全局函数:采用直接书写,不用下划线和前缀。
示例:如下例子不符合规范。
例1:stringgpGetModulepath();
例2:string_GetModulepath();
应如下书写
string GetModulepath();
5-2:拷贝构造函数:如果不需要拷贝构造函数,必须使用禁止拷贝构造函数。
5-3:函数的规模尽量限制在40行以内。
说明:不包括注释和空格行。
6 可测性
6-1:使用断言来发现软件问题,提高代码可测性。
说明:断言是对某种假设条件进行检查(可理解为若条件成立则无动作,否则应报告),
它可以快速发现并定位问题,同时对错误进行自动报警。
6-2: 正常调用assert的书写。
示例:如下例子不符合规范。
例1:
bool MyClass::OnPlayerEnter(CPlayer* player)
{
assert(player !=NULL);
printf(“%s”, player->m_name);
}
应如下书写
bool MyClass::OnPlayerEnter(CPlayer* player)
{
assert(player !=NULL);
if (player ==NULL)
{
assert(0);
LOGE(“player point is NULL maybe”, …); // 打印附近的变量(必须打印)
return false; orreturn true;
}
printf(“%s”, player->m_name);
}
6-3:程序开发环境(windows/linux)中断言的使用。
说明: 服务器程序有windows和linux版本。在windows上编写的程序用的断言,要写个控制,当程序移植到linux上时,assert失效。因此,如果在windows上写linux上运行使用的程序时,使用断言需要写一个接口,实现在linux上运行断言的效果也实现。
7 宏
7-1:使用#pragmaonce, 禁止使用#if def。
7-2:如果必须使用常量,使用宏定义的形式。
示例:(规范书写)
#define CORE_PI 3.14159265358979323846f
7-3:书写宏定义的位置规范。
说明:如果类里面用到宏,则定义到.h文件;如果是.cpp文件用到,则定义到.cpp文件。
7-4: 因为宏不受命名空间控制。如果要定义的宏可能已经被定义了,建议使用const。