华为、中兴编码规范

1.if、else、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();

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值