C++编程规范

无规矩不成方圆。好吧…用在这里有点过分了。简而言之,就是根据规范进行代码书写,将有助于我们更好的理解与实现代码与功能。
各种语言都有自己的语法,也都有自己的成文或者不成文的约定。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 print
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

你可能感兴趣的:(C++编程规范)