现在的位置: 首页 > 综合 > 正文

C++编码规范

2014年03月17日 ⁄ 综合 ⁄ 共 6701字 ⁄ 字号 评论关闭
本编码规范针对C++语言。制定本规范的目的:
提高代码的健壮性,使代码更安全、可靠;
提高代码的可读性,使代码易于查看和维护。
本文档分别对C++程序的格式、注释、标识符命名、语句使用、函数、类、程序组织、公共变量等方面做出了要求。规范分为两个级别——规则和建议。规则级的规范要求开发人员必须要遵守,建议级的规范开发人员应尽量遵守。
各项目组在用C++语言或基于C++语言的开发工具开发项目时,要遵守本规范。
     以下是各条规范的具体内容。
     对代码书写格式的要求。
规范级别:规则
规则描述:
在头文件和实现文件中,各主要部分之间要用空行隔开。
所谓文件的主要部分,包括:序言性注释、防止被重复包含部分(只在头文件中)、# include部分、#define部分、类型声明和定义部分、实现部分等等。
在一个函数中,完成不同功能的部分,要用空行隔开。
理由:
段落分明,提高代码的可读性。
规范级别:规则
规则描述:
在使用赋值运算符、逻辑运算符、位运算符、算术运算符等二元操作符时,在其两边各加一个空格。
例: nCount = 2;而不是 nCount=2
● 函数的各参数间要用“,”和一个空格隔开。
              例:void GetDate(int x, int y)
而不是void GetDate(int x,int y)void GetDate(int x ,int y)
理由:
提高代码的可读性。
规范级别:规则
规则描述:
不要在引用操作符前后使用空格,引用操作符指“.”和“->”,以及“[]”。
不要在“::”前后使用空格。
不要在一元操作符和其操作对象之间使用空格,一元操作符包括“++”、“--”“!”、“&”“*”等。
理由:
提高代码的可读性。
举例:
// 不要象下面这样写代码:
m_pFont -> CreateFont();
//应该写成这样
m_pFont->CreateFont();
规范级别:规则
规则描述:
对程序语句要按其逻辑进行水平缩进,以两个空格或一个Tab符为单位(建议使用空格),使同一逻辑层次上的代码在列上对齐。
理由:
提高代码的可读性。
规范级别:规则
规则描述:
较长的语句要分成多行书写。长表达式要在低优先级操作符处分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,缩进长度以两个空格或Tab符长度为单位。
理由:
提高代码的可读性。
举例:
// 下面是一个处理的较为合理的例子
nCount = Fun1(n1, n2, n3)
+ (nNumber1 * GetDate(n4, n5, n6)) * nNumber1;
规范级别:规则
规则描述:
控制语句(if , for , while , do...whule)的语句部分一定要用 ‘{ ’和‘ }’括起来(即使只有一条语句),并且‘{ ’和‘ }’应处在同一列上。
理由:
这样做,能够划分出清晰的语句块,使语句的归属明确,使代码更加容易阅读和修改。
举例:
//不要象下面这样写代码:
if (x == 0)
return;
else
while (x > min)
x--;
// 应该这样写
if (x == 0)
{
return;
}
else
{
while (x > min)
{
x--;
}
}
规范级别:规则
规则描述:
一行只写一条程序语句。
理由:
提高代码的可读性。
举例:
// 不要这样写
x = x0; y = y0;
while(IsOk(x)) {x++;}
// 应该这样写代码
x = x0;
y = y0;
while(IsOk(x))
{
x++;
}
2.1.8 一次只声明、定义一个变量
规范级别:规则
规则描述:
一次(一条声明、定义语句)只声明、定义一个变量。
理由:
提高代码的可读性。
举例:
// 应该这样写
int width;
int length;
// 不要这样写
int width, length;
规范级别:建议
规则描述:
对于一个表达式,在一个二元、三元操作符操作的操作数的两边,应该放置“(”和“)”。
理由:
避免出现不明确的运算、赋值顺序,提高代码的可读性。
举例:
// 下面这行代码:
result = fact / 100 * number + rem;
//最好写成这样
result = ((fact / 100) * number) + rem;
2.1.10将操作符“*”、“&”和类型写在一起
规范级别:规则
规则描述:
在定义指针、引用变量时,将操作符“*”、“&”和类型写在一起。
理由:
统一格式,提高代码的可读性。
举例:
// 不要象下面这样写代码:
 char *s;

//而应该写成这样
char* s;
这一部分对程序注释提出了要求。
程序中的注释是程序与日后的程序读者之间通信的重要手段。良好的注释能够帮助读者理解程序,为后续阶段进行测试和维护提供明确的指导。
下面是关于注释的基本原则:
1. 注释内容要清晰明了,含义准确,防止出现二义性。
2. 边写代码边注释,修改代码的同时修改相应的注释,保证代码与注释的一致性。
规范级别:规则
规则描述:
在函数的声明之前,要给出精练的注释(不必牵扯太多的内部细节),让使用者能够快速获得足够的信息使用函数。格式不做具体要求。
在函数的定义之前,要给出足够的注释。注释格式要求如下:
/*************************************************************************
【函数名称】       (必需)
【函数功能】       (必需)
【参数】           (必需。标明各参数是输入参数还是输出参数。)
【访问变量】       (必需。列出该函数访问的全局变量、成员变量。)
【返回值】         (必需。解释返回值的意义。)
【使用情况】       (必需。调用其它函数的情况,被调用的情况)
【开发者及日期】   (必需)
【版本】           (必需)
【更改记录】       (若有修改,则必需注明)
*************************************************************************/
理由:
提高代码的可读性。
规范级别:规则
规则描述:
● 在类的声明之前,要给出足够而精练的注释。注释格式要求如下:
/*************************************************************************
【类名】             (必需)
【功能】          (必需)
【接口说明】           (必需)
【开发者及日期】       (必需)
【版本】              (必需)
【版权信息】           (可选)
【更改记录】          (若修改过则必需注明)
*************************************************************************/
理由:
提高代码的可读性。
规范级别:规则
规则描述:
在头文件、实现文件的首部,一定要有文件注释,用来介绍文件内容。注释格式要求如下:
/*************************************************************************
【文件名】                 (必需)
【功能模块和目的】     (必需)
【开发者及日期】           (必需)
【版本】                  (必需)
【版权信息】               (必需)
【更改记录】              (若修改过则必需注明)
*************************************************************************/
理由:
提高代码的可读性。
规范级别:建议
规则描述:
        建议对每个空循环体给出确认性注释。
理由:
        提示自己和别人,这是空循环体,并不是忘了。
举例:
        while(g_bOpen == FALSE)
        {
           //空循环
         }
规范级别:建议
规则描述:
建议对多个case语句共用一个出口的情况给出确认性注释。
理由:
        提示自己和别人,这几case语句确实是共用一个出口,并不是遗漏了。
举例:
        switch(nNumber)
        {           
           case 1:
nCount++;
break;
           case 2:
           case 3:
nCount--;
break;       //nNumber等于23时,进行同样的处理
default:
break;
         }
规范级别:建议
规则描述:
除上面说到的,对于以下情况,也应该考虑进行注释:
变量的声明、定义。通过注释,解释变量的意义、存取关系等;
    例如:
           int m_nNumber; //记录图形个数。被SetDate( )GetDate( )使用。
数据结构的声明。通过注释,解释数据结构的意义、用途等;
    例如:
           //定义结构体,存储元件的端点。用于将新旧的端点对应。
typedef struct
{
                int nBNN;
                int nENN;
                int nBNO;
                int nENO;
}Element;
l分支。通过注释,解释不同分支的意义;
    例如:
                if(m_iShortRadio == 0)       //三相的情况
                {
                    strvC.Format("%-10.6f", vC);
                    straC.Format("%-10.6f", aC);
                }
                else if(m_iShortRadio == 1)    //两相的情况
                {
                    strvC = _T("");
                    straC = _T("");
                    }
l调用函数。通过注释,解释调用该函数所要完成的功能;
    例如:
                  SetDate(m_nNumber ); //设置当前的图形个数。
l赋值。通过注释,说明赋值的意义;
    例如:
           m_bDraw = true; //将当前设置为绘图状态
l程序块的结束处。通过注释,标识程序块的结束。
                       例如:
                           if (name = = White)
                           {
                                                
if (age = = 20)
{
                                                              }//年龄判断、处理结束
                   }//姓名判断、处理结束
l其它有必要加以注释的地方
理由:
提高代码的可读性。
规范级别:建议
规则描述:
同一个函数或模块中的行末注释应尽量对齐。
理由:
提高代码的可读性。
举例:
 nCount = 0;                        //计数器,表示正在处理第几个数据块
 BOOL bNeedSave;            //是否保存从服务器返回的数据
 BOOL bReturnCache;       //是否将Cache中的内容返回客户端
DWORD BytesWritten;   //写入的数据长度
规范级别:规则
规则描述:
注释行的数量不得少于程序行数量的1/3
    对标识符和文件的命名要求。
规范级别:规则
规则描述:
在程序中声明、定义的变量、常量、宏、类型、函数,在对其命名时应该遵守统一的命名规范。具体要求如下:
<!  l一般变量
一般变量名应以小写字母打头,各英文描述单词的首字母分别大写,其他字母一律小写。对于不同作用域的变量,其命名要求如下表所示:
2-1 变量命名
变量种类
前缀要求
示例
全局变量
g_
g_Number
全局指针变量
g_p
g_pNumber
对象级变量(类内数据成员)
文件作用域变量(文件中静态变量)
m_
m_Number
对象级指针变量(类内指针数据成员)
文件作用域指针变量(文件中静态指针变量)
m_p
m_pNumber
函数级变量(局部变量)
无要求
number
函数级指针变量(局部指针变量)
p
pNumber
    上表列出了对变量命名的基本要求。项目组或程序员可在该要求上再进行细化,但必须保证符合该要求。
<!  l常量
        常量的名字要全部大写。常量指:
const修饰的量。如const int NUMBER = 100;
枚举量。如enum{ ONE,TWO,THREE };
<!  l
        所有用宏形式定义的名字,包括宏常量和宏函数,名字要全部大写。
<!  l类型
自定义类型名应以大写字母打头。C++中自定义类型包括:class、struct、enum、union、typedef声明的类型、namespace。
例如:typedef struct Student;
      class CMsgDialog;
<!  l函数
函数名应以大写字母打头。
例如:void GetCount();
 
下面还有一些在命名时应该遵守的基本规范:
<!  l名中含多于一个单词时,每个单词的第一个字母大写。
例如:m_LastCount 中要大写L和C;
<!  l不要使用以下划线_打头的标识符。
    例如:_bFind 是不允许出现的变量;
<!  l不要使用仅用大小写字母区分的名称。
    例如:m_bFind 和 M_BFIND;
<!  l尽量使用有意义的名字。应做到见其名知其意。
例如:m_strError 表示错误的字符串;
理由:
减少命名冲突;提高代码的可读性。
规范级别:规则
规则描述:
在程序中声明、定义的变量、常量、宏、类型、函数,它们的名字长度要在425个字符之内(下限不包括前缀,上限包括名字中所有的字符)。
对于某些已经被普遍认同的简单命名,可不受本规则的限制。如for循环的循环记数变量,可使用 i j 等简单字符命名。
理由:
名字长度应该在一个恰当的范围内,名字太长不够简洁,名字太短又不能清晰表达含义。
规范级别:建议
规则描述:
代码文件的名字要与文件中声明、定义的类的名字基本保持一致,使类名与类文件名建立联系。
理由:
使应用程序容易理解。
举例:
将类CMsgDialog的头文件和实现文件命名为msgdialog.h和msgdialog.cpp就是一种比较简单、恰当的方法。
    对具体程序语句的使用要求。
规范级别:建议
规则描述:
在一条程序语句中,只应包含一个赋值操作符。赋值操作符包括:=, +=, -=, *=, /=, %=, >>=, <<=, &=, |=,^=, ++, --。
理由:
避免产生不明确的赋值顺序。
举例:
// 不要这样写
b = c = 5;
a = (b * c) + d++;
// 应该这样写
c = 5;
b = c;
a = (b * c) + d;
d++;
2.4.2 不要在控制语句的条件表达式中使用赋值操作符
规范级别:建议
规则描述:
不要在控制语句if, while, for switch的条件表达式中使用赋值操作符。赋值操作符包括:=, +=, -=, *=, /=, %=, >>=, <<=, &=, |=, ^=,++,--。
理由:
一个类似于 if (x = y)这样的写法是不明确、不清晰的,代码的作者也许是想写成这样: if (x == y)。
举例:
//不要象下面这样写代

抱歉!评论已关闭.