编程规范

1.ifelse、else if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加
{ }。

 

 

说明:这样可以防止书写失误,也易于阅读。

 

正例:

 

if (varible1 < varible2)

{

    varible1 = varible2;

}

 

反例:下面的代码执行语句紧跟if的条件之后,而且没有加{},违反规则。

 

 

 

if (varible1 < varible2) varible1 = varible2; 

 

 

2.源程序中关系较为紧密的代码应尽可能相邻。

 

说明:这样便于程序阅读和查找。

 

正例:

 

iLength    = 10;

iWidth     = 5;     // 矩形的长与宽关系较密切,放在一起。

StrCaption = "Test";

 

反例:

 

iLength    = 10;

strCaption = "Test";

iWidth     = 5;

 

3.程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。{ }之内的代码块使用缩进规则对齐。

 

说明:这样使代码便于阅读,并且方便注释。

 

do while语句和结构的类型化时可以例外,while条件和结构名可与 } 在同一行。

 

正例:

 

void Function(int iVar)

{// 独占一行并与引用语句左对齐。

    while (condition)

   {

        DoSomething();   // 与{ }缩进4格

    }

}

 

反例:

 

void Function(int iVar){

while (condition){

DoSomething();

}}

 

4.switch语句中,每一个case分支和default要用{ }括起来,{ }中的内容需要缩进。

 

5.不同逻辑程序块之间要使用空行分隔。

说明:空行起着分隔程序段落的作用。适当的空行可以使程序的布局更加清晰。

 

正例:

void Foo::Hey(void)

{

    [Hey实现代码]

}

// 空一行

 

void Foo::Ack(void)

{

    [Ack实现代码]

}

 

反例:

void Foo::Hey(void)

{

    [Hey实现代码]

}

void Foo::Ack(void)

{

    [Ack实现代码]

}

// 两个函数的实现是两个逻辑程序块,应该用空行加以分隔。

 

6.一元操作符如“!”、“~”、“++”、“--”、“*”、“&”(地址运算符)等前后不加空格。“[]”、“.”、“->”这类操作符前后不加空格。

 

正例:

!bValue

~iValue

++iCount

*strSource

&fSum

aiNumber[i] = 5;

tBox.dWidth

tBox->dWidth

 

7.多元运算符和它们的操作数之间至少需要一个空格。

 

正例:

fValue  =  fOldValue;

fTotal  +  fValue

iNumber +=  2;

 

8.关键字之后要留空格。

说明:if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。

 

9.函数名之后不要留空格。

说明:函数名后紧跟左括号‘(’,以与关键字区别。

 

10.(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。‘,’之后要留空格。‘;’不是行结束符号时其后要留空格

正例:

例子中的 凵 代表空格。

for(i=0;i<MAX_BSC_NUM;i++)

{

    DoSomething(iWidth,iHeight);

}

 

11.注释符与注释内容之间要用一个空格进行分隔。

 

正例:

/* 注释内容 */

// 注释内容

 

反例:

/*注释内容*/

//注释内容

 

12.包含在{}中代码块的结束处应加注释,便于阅读。特别是多分支、多重嵌套的条件语句或循环语句。

说明:此时注释可以用英文,方便查找对应的语句。

 

正例:

 

void Main()

{

    if (…)

    {

        …

       while (…)

       {

            …

        }  /* end of while (…) */      // 指明该条while语句结束

        …

      }  /* end of if (…) */          // 指明是哪条语句结束

}  /*  end of void main()*/      // 指明函数的结束

 

13.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

 

说明:在使用缩写时或之前,应对缩写进行必要的说明。

 

正例:

如下书写比较结构清晰

/* 获得子系统索引 */

iSubSysIndex = aData[iIndex].iSysIndex;

 

/* 代码段1注释 */

[ 代码段1 ]

 

/* 代码段2注释 */

[ 代码段2 ]

 

反例1

如下例子注释与描述的代码相隔太远。

/* 获得子系统索引 */

 

iSubSysIndex = aData[iIndex].iSysIndex;

 

反例2

如下例子注释不应放在所描述的代码下面。

iSubSysIndex = aData[iIndex].iSysIndex;

/* 获得子系统索引 */

 

反例3

如下例子,显得代码与注释过于紧凑。

/* 代码段1注释 */

[ 代码段1 ]

/* 代码段2注释 */

[ 代码段2 ]

 

14.注释与所描述内容进行同样的缩排。

 

说明:可使程序排版整齐,并方便注释的阅读与理解。

 

正例:

 

如下注释结构比较清晰

 

int DoSomething(void)

{

 

    /* 代码段1注释 */

    [ 代码段1 ]

 

    /* 代码段2注释 */

    [ 代码段2 ]

}

 

 

 

反例

 

如下例子,排版不整齐,阅读不方便;

int DoSomething(void)

{

/* 代码段1注释 */

 

    [ 代码段1 ]

 

/* 代码段2注释 */

 

    [ 代码段2 ]

 

}

 

15.标识符的命名应当符合“min-length && max-information”原则。

 

说明:较短的单词可通过去掉“元音”形成缩写,较长的单词可取单词的头几个字母形成缩写,一些单词有大家公认的缩写,常用单词的缩写必须统一。协议中的单词的缩写与协议保持一致。对于某个系统使用的专用缩写应该在某处做统一说明。

正例:如下单词的缩写能够被大家认可:

      temp 可缩写为  tmp  ;

      flag 可缩写为  flg  ;

      statistic 可缩写为  stat ;

      increment 可缩写为  inc  ;

      message   可缩写为  msg  ;

 

16.用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

 

说明:下面是一些在软件中常用的反义词组。

      add/remove ; begin/end ;   create/destroy ;      insert/delete ;

      first/last ; get/release ; increment/decrement ; put/get ;

      add/delete ; lock/unlock ; open/close ;          min/max ;

      old/new ;    start/stop ;  next/previous ;       source/target ;

      show/hide ;  send/receive ;source/destination ;  cut/paste ;

      up/down

 

17.宏、常量名都要使用大写字母, 用下划线 ‘_ 分割单词。预编译开关的定义使用下划线 ‘_ 开始。

正例:如 DISP_BUF_SIZE、MIN_VALUE、MAX_VALUE 等等。

 

18.尽量避免名字中出现数字编号,如Value1、Value2等,除非逻辑上的确需要编号。

 

19.在表达式中使用括号使表达式的运算顺序更清晰。

 

说明:由于将运算符的优先级与结合律熟记是比较困难的,为了防止产生歧义并提高可读性,即使不加括号时运算顺序不会改变,也应当用括号确定表达式的操作顺序。

 

正例:                                       

if (((iYear % 4 == 0) && (iYear % 100 != 0)) || (iYear % 400 == 0))

 

反例:

if (iYear % 4 == 0 && iYear % 100 != 0 || iYear % 400 == 0)

 

20.不可将布尔变量和逻辑表达式直接与TRUE、FALSE或者1、0进行比较。

 

说明:TURE和FALSE的定义值是和语言环境相关的,且可能会被重定义的。

正例:

 

设bFlag 是布尔类型的变量

if (bFlag)   // 表示flag为真

if (!bFlag)  // 表示flag为假

 

反例:

 

设bFlag 是布尔类型的变量

if (bFlag == TRUE)

if (bFlag == 1)

if (bFlag == FALSE)

if (bFlag == 0)

 

21.在条件判断语句中,当整型变量与0 比较时,不可模仿布尔变量的风格,应当将整型变量用“==”或“!=”直接与0比较。

 

正例:

if (iValue == 0)  

if (iValue != 0)

 

反例:

if (iValue)     // 会让人误解 iValue是布尔变量

if (!iValue)

 

22.如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。

 

说明:下面两个示例中,反例比正例多执行了NUM -1次逻辑判断。并且由于前者总要进行逻辑判断,使得编译器不能对循环进行优化处理,降低了效率。如果NUM非常大,最好采用正例的写法,可以提高效率。

 

const  int NUM = 100000;

 

正例:

 

if (bCondition)

{

    for (i = 0; i < NUM; i++)

    {

         DoSomething();

    }

}

else

{

    for (i = 0; i < NUM; i++)

    {

        DoOtherthing();

    }

}

 

反例:  

 

for (i = 0; i < NUM; i++)

{

    if (bCondition)

    {

        DoSomething();

    }

    else

   {

        DoOtherthing();

    }

}


原博:http://www.cnblogs.com/jiqing9006/p/3935496.html

中兴软件编程规范完整版:https://www.cnblogs.com/yuweifeng/p/5546409.html

猜你喜欢

转载自blog.csdn.net/u012989012/article/details/80688882