无规矩不成方圆。好吧…用在这里有点过分了。简而言之,就是根据规范进行代码书写,将有助于我们更好的理解与实现代码与功能。
各种语言都有自己的语法,也都有自己的成文或者不成文的约定。C++相较于其他的语言也有自己的习惯,现在就C++的编程规范进行简单的展开介绍。
C++编程规范
命名规范
通则
- 所有命名都应使用标准的英文单词或缩写,不得使用拼音或拼音缩写,除非该名字描述的是中文特有的内容,如半角、全角, 声母、韵母等。
- 所有命名都应遵循达意原则,即名称应含义清晰、明确。
- 所有命名都不易过长,应控制在规定的最大长度以内。
- 所有命名都应尽量使用全称。
- 如果命名使用缩写,则应该使用《通用缩写表》(见文末)的缩写;原则上不推荐使用《通用缩写表》以外的缩写,如果使用,则必须对其进行注释和说明。
具体规范
工程名
不强制统一。
文件名
- 只能由英文字母、数字和下划线组成文件名。
- 区分大小写,基于跨平台的考虑,建议全小写。
- 长度不限于 8.3 格式(已过气,文件名不能超过8个字符,后缀也就是扩展名不超过3个字符),建议不多于 30 个字符。
- 如果文件用于定义或实现类,则文件名与类名必须保持一致。
函数名
- 参照Windows API命名规范。
- 函数名最长不得超过64个字符。
- 推荐使用动宾结构。函数名应清晰反映函数的功能、用途。
- 推荐函数名第一个字母大写。
变量名
遵从匈牙利记法(前缀+类型+名称),不得超过32个字符。
-
格式
[m_|s_|g_] type [class name|struct name] variable name
变量类型:
m_ :类的成员变量
ms_:类的静态成员变量
s_ :静态全局变量
g_ :普通全局变量
- 数据类型:
char, TCHAR: c/ch
字符串: s/sz/str
bool, BOOL: b
int, __int16,__int32,__int64: n
unsigned: u
long: l
unsigned long: ul
double, float: f
BYTE: by
WORD: w
DWORD: dw
function: fn
pointer:p
小范围局部变量与结构成员可省略类型缩写
类名
- 必须以大写"K"开头,后面字母反映具体含义,以清晰表达类的用途和功能为原则。
- 接口必须以大写"I"开头,代表 Interface 。
- 当名称由多个单词构成时,每一个单词的第一个字母必须大写。
结构、宏、枚举、联合 名字必须大写
文件起始处说明
.h/.cpp开头
Filename:
Creator:
Date:
Comment:
示例:
///////////////////////////////////////////////////////////////
//
// FileName : KSample.h
// Creator : John Doe
// Date : 2004-2-4 21:42:54
// Comment :
//
///////////////////////////////////////////////////////////////
注释
注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,
注释太多了会让人眼花缭乱。注释的花样要少。
- 函数(功能、入口、出口)
- 自动生成文档工具:Doxygen
块注释
开头/**
*/
结尾
示例:
/**
* ... This is a block comment ...
*/
行注释
开头:///
示例:
/// This is a line comment...
大括号内嵌代码
if、while、do等其大括号内嵌代码比较长或者多层嵌套时,在结尾的}
后面要加上对应的语句的注释说明。
示例:
if ((isWindow == TRUE) && (isVisible == true))
{
代码段
}// if ((isWindow == TRUE)...
描述某个代码段的注释,可以给注释描述的代码段外围加上{},帮助阅读。
示例:
//代码段实现功能或者意图描述
{
代码段
}
函数注释
入口参数有缺省值时
示例:
BOOL KSSaveToFile(const char cszFileName[],BOOL bCanReplace /* = TRUE */ );
或者:
BOOL KSSaveToFile(
const char cszFileName[],
BOOL bCanReplace // = TRUE
);
函数的摘要(brief)
在函数声明主体开头的注释块中加上控制符:@brief
示例:
/**
* @brief 用于...
*/
int function(void);
函数的形参(param)
在函数声明主体开头的注释块中加上控制符:@param
示例:
/**
* @param buf1 缓冲区1
* @param buf2 缓冲区2
* @param count 字符的个数
*/
intmemcmp(const void *buf1,const void *buf2,size_t count);
函数的返回值(return)
在函数声明主体开头的注释块中加上控制符:@return
示例1:
/**
* @return 读取的字符
*/
int getchar(void);
示例2:
/**
* @return None
*/
void rewind(FILE *stream);
函数的注意事项(remark)
在函数声明主体开头的注释块中加上控制符:@remark
示例:
/**
* @remark 拷贝strSource到strDestination(包含strSource中的‘\0’),要注意在拷贝的过程中并没有移除检查
*/
char *strcpy(char *strDestination,const char *strSource);
每行代码长度
每行代码的长度推荐为80个ASCII字符,最长不得超过120;折(she/zhe?)行(xing)以对齐为准。
示例:
HANDLE KSOpenFile(const char cszFileName[],
int nMode);
BOOL KSReadFile(
HANDLE hFile,
void *pvBuffer,
int nReadSize,
int *pnReadSize
);
合并行的问题
循环、分支代码,判断条件与执行代码不得在同一行上。
示例:
正确:
if (n == -2)
n = 1;
else
n = 2;
不得写做:
if (n == -2) n = 1;
else n = 2;
指针中*
的位置
指针的定义,*
既可以紧跟类型,也可以在变量名之前。
示例:
可写做: int* pnsize;
也可写做: int *pnsize;
但不得写做: int * pnsize;
全局函数的调用
在类的成员函数内调用全剧函数时,在全局函数名前必须叫上::
。
if...else if
else if必须写在一行。
与{
,}
有关的规定
在'{'之前不允许有 空格与Tab之外的其他任何字符;在他之后可有注释,但不允许有代码。
与{
对应的}
必须在同一列。此处应该务必与Java区分开
示例:
正确:
for (i = 0; i < cbLine; i++)
{ // .....
printf("Line %d:", i);
printf("%s\n", pFileLines[i]);
}
不得写做:
for (i = 0; i < cb; i++)
{ printf("Line %d:", i);
printf("%s\n", pFileLines[i]);
}
也不得写做:
for (i = 0; i < cb; i++){
printf("Line %d:", i);
printf("%s\n", pFileLines[i]);
}
在循环、分支之后只有一行代码
在循环、分支之后若只有一行代码,在无歧义的情况下可省略{
,}
。
示例:
if (n == -2)
n = 1;
else
n = 2;
与空格有关的规定
运算符
- 单目运算符两端不必空格。(逻辑非
!
,按位取反~
,自增自减++
/--
,负号-
,(int)
等类型转换运算符,指针运算符*
,取地址运算符&
,长度运算符sizeof
)最好不要加空格,部分资料显示(int)
等类型转换运算符、*
、&
之后不得有空格
示例:
可写做:
(KSFile*)pFile
也可写做:
(KSFile *)pFile
不得写做:
( KSFile* )pFile
( KSFile * ) pFile
- 两目运算符,三目运算符两边必须都有空格。
-
->
,::
,.
,[
,]
等运算符前后不得有空格。
for,while,if等关键字
for,while,if等关键字之后应有一个空格,再接(
。
示例:
正确:
if (-2 == n)
不得写做:
if(-2 == n)
调用函数、宏时,(
前不得有空格。
示例:
正确:
printf("%d\n", nIndex);
不得写做:
printf ("%d\n", nIndex);
与缩进有关的规定
- 缩进以Tab为单位,要求在编辑器中将1个Tab设置为4个空格宽度。
缩进一个Tab
- 函数体相对于函数名及
{
、}
。
示例:
int Power(int x)
{
return (x * x);
}
- if、else、for、while、do等之后的代码。
- 一行写不下,折行之后的代码,应在合理的位置进行折行。若有
+-*/
等运算符,则运算符应该在上一行末尾,而不应该在下一行的行首。
不必缩进
- switch之后的case与default。
示例:
switch (nID)
{
case ID_PLAY:
......
break;
case ID_STOP:
......
break;
default:
......
break;
}
出错处理
具体参考项目组要求,项目组在开始编码前必须为项目定义明确的出错处理规范。
与类相关的.h文件与.cpp文件
- 原则上,应该在一个单独的.h文件中定义一个类,在一个单独的.cpp文件中实现这个类。.h与.cpp文件的文件名必须与类名相同。
- 若几个类的规模都不大,关系又很密切,则可以在一个.h中定义这些类,在一个.cpp中实现。对于附属于较大规模类的一个较小规模类,可以卸载那个大规模类的.h与.cpp里。
附:通用缩写表
缩写 | 全称 |
---|---|
add | address |
adm | adminstrator |
app | application |
arg | argument |
asm | assemble |
asyn | asynchronization(异步,非同步化) |
avg | average |
DB | database |
bk | back |
bmp | bitmap(位图文件) |
btn | button |
buf | buffer |
calc | calculate |
char | character |
cha | change |
clk | click |
clr | color |
cmd | command |
cmp | compare |
col | column |
coord | coordinates(坐标) |
cpy | copy |
ctl\ctrl | control |
cur | current |
cyl | cylinder(圆筒,圆柱体) |
dbg | debug |
dbl | double |
dec | decrease |
def | default |
del | delete |
dest\dst | destination |
dev | device |
dict | dictionary |
diff | different |
dir | directory |
dis | display |
div | divide |
dlg | dialog |
doc | document |
drv | driver |
dyna | dynamic |
env | environment |
err | error |
ex/ext | extend |
exec | execute |
flg | flag |
frm | frame |
func/fn | function |
grp | group |
horz | horizontal |
idx/ndx | index |
img | image |
impl | implment |
inc | increase |
info | information |
init | initial/initialize/initialization |
ins | insert |
inst | instance |
INT/intr | interrupt |
len | length |
lib | library |
lnk | link |
log | logical |
lst | list |
max | maximum |
mem | memory |
mgr/man | manage/manager |
mid | middle |
min | minimum |
msg | message |
mul | multiply |
num | number |
obj | object |
ofs | offset |
org | origin/original |
param | parameter |
pic | picture |
pkg | package(大包) |
pkt | packet(小包) |
pnt/pt | point |
pos | position |
pre/prev | previous |
prg | program |
prn | |
proc | process/procedure |
prop | properties |
psd | password |
ptr | pointer |
pub | public |
rc | rect |
ref | reference |
reg | register |
req | request |
res | resource |
ret | return |
rgn | region |
scr | screen |
sec | second |
seg | segment |
sel | select |
src | source |
std | standard |
stg | storage |
stm | stream |
str | string |
sub | subtract |
sum | summation(合计) |
svr | server |
sync | synchronization(同步) |
sys | system |
tbl | table |
temp/tmp | temporary |
tran/trans | translate/translation/transparent(显然的) |
tst | test |
txt | text |
unk | unknown |
upd | update |
util | utility(实用工具) |
var | variable |
ver | version |
vert | vertical |
vir | virus |
wnd | window |