自己的编码有很多不规范的地方:
先规定如下:
如下是C++的编码规范:
1 前言 4
2 文件结构 4
2.1 版本的声明 4
位置:版本的声明位于头文件和定义文件的开头
规范:
/*
* 文件名称:filename.h
* 摘 要:简要描述本文件的内容
*
* 当前版本:1.1
* 作 者:输入作者(或修改者)名字
* 完成日期:2007年1月29日
*
* 取代版本:1.0
* 原 作 者:输入原作者(或修改者)名字
* 完成日期:2001年5月10日
*/
2.2 头文件的结构 4
开始位置:
/*
* 文件名称:filename.h
* 摘 要:简要描述本文件的内容
*
* 当前版本:1.1
* 作 者:输入作者(或修改者)名字
* 完成日期:2007年1月29日
*
* 取代版本:1.0
* 原 作 者:输入原作者(或修改者)名字
* 完成日期:2001年5月10日
*/
#include <math.h> // 引用标准库的头文件
…
#include “myheader.h” // 引用非标准库的头文件
…
void Function1(…); // 全局函数声明
…
class Box // 类结构声明
{
…
};
#endif
2.3 定义文件的结构 5
开始位置:
/*
* 文件名称:filename.h
* 摘 要:简要描述本文件的内容
*
* 当前版本:1.1
* 作 者:输入作者(或修改者)名字
* 完成日期:2007年1月29日
*
* 取代版本:1.0
* 原 作 者:输入原作者(或修改者)名字
* 完成日期:2001年5月10日
*/
#include “graphics.h” // 引用头文件
…
// 全局变量定义体
int gVar;
…
// 全局函数的实现体
void Function1(…)
{
…
}
// 类成员函数的实现体
void Box::Draw(…)
{
…
}
2.4 目录结构 6
如果文件数目超过十个,则需要分别将头文件和定义文件保存到不同的目录,便于维护。
例如可将头文件保存于include目录,将定义文件保存于source目录(可以是多级目录)。
3 程序结构 6
3.1 缩进 6
{
cout<<"{..}之后的内容需要空两格,并保证不要使用制表符"<<endl;
}
3.2 空行 6
1.类声明、函数定义之后都要空行:
void Function(...)
{
cout<<"function1"<<endl;
}
//需要空行
void Function()
{
cout<<"function2"<<endl;
}
//继续空行
2.函数体内,关系密切的语句之间不加空行,其他的地方应加空行分隔。
while (condition1)
{
statement1;
//空一行
if(condition)
{
statement2;
}
else
{
statement3;
}
//空一行
statment4;
}
3.3 代码行 7
1.一行代码只做一件事情,目的是为了方便注释和阅读
int flag1; //标记1
int flag2; //标记2
2.if、while、for独占一行
if (condition)
{
dosomething(); //执行体
}
for (initalization;condition;update)
{
dosomething(); //执行体
}
3.变量的定义满足"就近原则",变量的定义的同时要进行初始化
int iWidth; //宽度
int iHight; //高度
3.4 代码行内的空格 7
1.留空格的情况:
1.1.关键字之后要留空格,如 const、virtual、inline、case,if、while、for也需要留一个空格再与 ( 结合.eg: if (condition)
1.2.","之后要留空格,如 void Function(x, y, z)
";"如果不是一行的结束,也需要空格,for (initialization; condition; update)
1.3.赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”
等二元操作符的前后应当加空格.
2.不留空格
2.1. 函数名之后不留空格 void Function(x, y, z)
2.2. (;) //这种情况的话就不需要空格
2.3.一元操作符如“!”、“~”、“++”、“—”、“&”(地址运算符)等前后不加空格
2.4.对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空 格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))
3.5 对齐 8
void Function(int x)
{
...//前面空2个空格
}
for()
{
for()
{
..//嵌套{}的情况
}
}
3.6 长行拆分 9
1.代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
2.长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
If ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}
virtual Cmatrix CmultiplyMatrix (Cmatrix leftMatrix,
Cmatrix rightMatrix);
for (very_longer_initialization;
very_longer_condition;
very_longer_update)
{
dosomething();
}
4 命名规则 3
1.类/结构
1.1. 类的命名推荐用"名词"或"形容词+名词"的形式,例如:"CAnalyzer", "CFastVector" ....
2.函数
2.1. 函数名应当使用"动词"或者"动词+名词"(动宾词组)的形式。例如:"GetName()", "SetValue()", "Erase()", "Reserve()" ....
2.2.保护成员函数 保护成员函数的开头应当加上一个下划线“_”以示区别,例如:"_SetState()" ....
2.3.私有成员函数 类似地,私有成员函数的开头应当加上两个下划线“__”,例如:"__DestroyImp()" ....
2.4.虚函数 虚函数习惯以“Do”开头,如:"DoRefresh()", "_DoEncryption()" ....
2.5.回调和事件处理函数 回调和事件处理函数习惯以单词“On”开头。例如:"_OnTimer()", "OnExit()" ....
变量
变量应该是程序中使用最多的标识符了,变量的命名规范可能是一套C++命名准则中最重要的部分:
变量的命名 变量名由 作用域前缀+类型前缀 +一个或多个单词组成。为便于界定,每个单词的首字母要大写。
对于某些用途简单明了的局部变量,也可以使用简化的方式,如:i, j, k, x, y, z ....
作用域前缀 作用域前缀标明一个变量的可见范围。作用域可以有如下几种:
前缀 说明
无 局部变量
m_ 类的成员变量(member)
sm_ 类的静态成员变量(static member)
s_ 静态变量(static)
g_ 外部全局变量(global)
sg_ 静态全局变量(static global)
gg_ 进程间共享的共享数据段全局变量(global global)
除非不得已,否则应该尽可能少使用全局变量。
类型前缀 类型前缀标明一个变量的类型,可以有如下几种:
前缀 说明
n 整型和位域变量(number)
e 枚举型变量(enumeration)
c 字符型变量(char)
b 布尔型变量(bool)
f 浮点型变量(float)
p 指针型变量和迭代子(pointer)
pfn 特别针对指向函数的指针变量和函数对象指针(pointer of function)
g 数组(grid)
i 类的实例(instance)
对于经常用到的类,也可以定义一些专门的前缀,如:std::string和std::wstring类的前缀可以定义为"st",std::vector类的前缀可以定义为"v"等等。
类型前缀可以组合使用,例如"gc"表示字符数组,"ppn"表示指向整型的指针的指针等等。
推荐的组成形式 变量的名字应当使用"名词"或者"形容词+名词"。例如:"nCode", "m_nState","nMaxWidth" ....
5 程序必要模块 11
5.1 程序LOG 11
5.1.1 跟踪日志 11
跟踪日志是为了开发人员更好定位程序的问题,此日志只供开发人员自己使用。该类型的日志路径,一天一个文件夹,文件夹以“年月日”命名,如“2007124”。内容按如下格式填写:
信息内容:
时间:2007-1-24 13:49:25
信息:XXXXXXXXXXXX
时间:2007-1-24 13:49:25
信息:XXXXXXXXXXXX
5.1.2 监控日志 11
正常日志
正常日志文件以线程为单位,一个线程一个文件,以应用ID加上线程ID为文件名,如100001_1.log(应用ID为100001,线程ID为1),其中应用ID是事先分配(根据监控程序的配置分配),而线程ID则根据开发人员自行定义,遵循连续性原则(从1开发)。
错误日志
又包括数据错误和其他错误,数据库错误的文件名格式为:应用ID_年月日_dberr.log如:100001_20081224_dberr.log(应用ID为100001,时间20081224)。其他错误的文件格式为应用ID_年月日_err.log如:100001_20081224_err.log(应用ID为100001,时间20081224)。
信息内容:
时间:2007-1-24 13:49:25
信息:XXXXXXXXXXXX
时间:2007-1-24 13:49:25
信息:XXXXXXXXXXXX