C++中使用宏需要注意的规范
来源:互联网 发布:山东双轨直销软件 编辑:程序博客网 时间:2024/05/17 07:48
使用宏需要注意的规范
1. 用宏定义表达式时,要使用完备的括号
如:
#define RECTANGLE_AREA( a, b ) (a) * (b)#define RECTANGLE_AREA( a, b ) ((a) * (b))
主要原因就是由于宏替换的时候只是简单的字符替换, 如果我们不使用完备的括号, 那么很有可能或造成结果和我们想要得到的表达式不同.
2. 使用宏时,不允许参数发生变化
在某种程度上带参的宏定义与函数有几分类似。但是必须注意它们的区别,正如下面代码片段所示:
#define SQUARE( a ) ((a) * (a)) int Square(int a) { return a*a; } int nValue1 = 10, nValue2 = 10; int nSquare1 = SQUARE(nValue1++); // nSquare1=110, nValue1=12 int nSquare2 = Square(nValue2++);// nSquare2=100, nValue2=11
类似的定义,却产生了不同的结果,究其原因还是宏的字符替换问题。正如上面的示例一样,两处的a都被参数nValue1++替换了,所以nValue1自增操作也就被执行了两回。
这就是宏在展开时对其参数的多次取值替换所带来的副作用。为了避免出现这样的副作用,最简单有效的方法就是保证宏参数不发生变化,如下所示。
#define SQUARE( a ) ((a) * (a)) int nValue1 = 10; int nSquare1 = SQUARE(nValue1); // nSquare1=100 nValue1++; // nValue1=11
3. 用大括号将宏所定义的多条表达式进行括起来
如果宏定义包含多条表达式,一定要用大括号将其括起来。如果没有这个大括号,宏定义中的多条表达式很有可能只有第一句会被执行,正如下面的代码片段:
#define CLEAR_CUBE_VALUE( l, w, h )\ l = 0;\ w = 0;\ h = 0; int i = 0; for (i = 0; i < CUBE_ACOUNT; i++) CLEAR_CUBE_VALUE( Cubes[i].l, Cubes[i].w, Cubes[i].h );
简单的字符替代,并不能保证多条表达式都会放入for循环的循环体内,因为没有将它包围在循环体内的大括号中。正确的做法应该是用大括号将多条表达式括起来,这样就能保证多条表达式全部执行了,如下面的代码片段所示:
#define CLEAR_CUBE_VALUE( l, w, h )\ {\ l = 0;\ w = 0;\ h = 0;\ }
阅读全文
0 0
- C++中使用宏需要注意的规范
- C语言编码规范--->自己需要注意的项
- Object-C中需要注意的细节
- C语言使用需要注意的地方
- Spring使用中需要注意的地方
- HttpURLConnection使用中需要注意的地方
- VFW中使用capSetVideoFormat需要注意的
- 使用JavaScript 中需要注意的问题
- VFW中使用capSetVideoFormat需要注意的
- 编写代码时需要注意的规范
- 编写代码时需要注意的规范
- 需要注意的开发规范和习惯
- 代码评审需要注意的项目规范
- C语言中“命名”需要注意的几点
- C语言中需要注意的一些地方
- c语言中需要注意的一些地方
- C/C++中需要注意的一些问题
- C语言中移位符需要注意的地方
- <1>炫彩界面库源码分析---简单的应用程序过程分析
- phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
- 用js语句实现网页中的选项卡(两种方法)
- Linux驱动中断函数参数详解
- STM32F407VG discovery MB997B 的串口问题
- C++中使用宏需要注意的规范
- MongoDB优化
- Unbutu安装TP LINK TL-WN823N驱动
- POJ2226_Muddy Fields_二分图匹配求“二者必得其一”
- 二手车电商格局未定,谁是杀出的一匹黑马?
- VManagePlatform 虚拟化平台之KVM
- 关于动态规划矩阵连乘的心得体会
- 区块链1.0:货币
- 如何让Outlook随系统启动+关闭变为后台运行