编写高质量代码:改善C++程序的150个建议(连载3)

发表于:2012-4-05 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李健    来源:51Testing软件测试网采编

  (2)使用宏时,不允许参数发生变化。

  宏参数始终是一个比较敏感、容易引发错误的东西。有很多人认为,在某种程度上带参的宏定义与函数有几分类似。但是必须注意它们的区别,正如下面代码片段所示:

  1. #define SQUARE( a ) ((a) * (a))  
  2. int Square(int a)  
  3. {  
  4.      return a*a;  
  5. }  
  6.  
  7. int nValue1 = 10nValue2 = 10;  
  8. int nSquare1 = SQUARE(nValue1++); // nSquare1=110nValue1=12 
  9. int nSquare2 = Square(nValue2++);// nSquare2=100nValue2=11

  类似的定义,却产生了不同的结果,究其原因还是宏的字符替换问题。正如上面的示例一样,两处的a都被参数nValue1++替换了,所以nValue1自增操作也就被执行了两回。

  这就是宏在展开时对其参数的多次取值替换所带来的副作用。为了避免出现这样的副作用,最简单有效的方法就是保证宏参数不发生变化,如下所示。

  1. #define SQUARE( a ) ((a) * (a))  
  2.  
  3. int nValue1 = 10;  
  4. int nSquare1 = SQUARE(nValue1); // nSquare1=100 
  5. nValue1++; //  nValue1=11

  (3)用大括号将宏所定义的多条表达式括起来。

  如果宏定义包含多条表达式,一定要用大括号将其括起来。如果没有这个大括号,宏定义中的多条表达式很有可能只有第一句会被执行,正如下面的代码片段:

  1. #define CLEAR_CUBE_VALUE( l, w, h )\  
  2.     l = 0;\  
  3.     w = 0;\  
  4.      h = 0;  
  5.  
  6. int i = 0;  
  7. for (i = 0; i < CUBE_ACOUNT; i++)  
  8.     CLEAR_CUBE_VALUE( Cubes[i].l, Cubes[i].w, Cubes[i].h );

  简单的字符替代,并不能保证多条表达式都会放入for循环的循环体内,因为没有将它包围在循环体内的大括号中。正确的做法应该是用大括号将多条表达式括起来,这样就能保证多条表达式全部执行了,如下面的代码片段所示:

  1. #define CLEAR_CUBE_VALUE( l, w, h )\  
  2. {\  
  3.     l = 0;\  
  4.     w = 0;\  
  5.      h = 0;\  
  6. }

  请记住:

  正确合理使用C语言中的宏,能有效地增强代码的可读性。但是也要遵守一定的规则,避免踏入其中的陷阱:(1)用宏定义表达式时,要使用完备的括号。(2)使用宏时,不允许参数发生变化。(3)用大括号将宏所定义的多条表达式包括起来。

相关链接:

编写高质量代码:改善C++程序的150个建议(连载1)

编写高质量代码:改善C++程序的150个建议(连载2)

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号