一.使用#define宏应注意的问题
1.使用宏定义表达式的时候,加括号是一个好习惯
首先我们来看一段简短的代码,并试着分析其输出:
#include#define Add(a,b) a+b int main() { std::cout<
结果输出:
< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+utzP1Mi7o6y1sc7Sw8e/tLW91eLDtNK7ts60+sLrtcTKsbryo6y/z7aou+Hf2tau0tSxx6OsyM/OqtXiw7S88rWltcS07c7z1PXDtL/JxNy3os/WsrvBy6O/sfC8saOs1eK7uda7yse/qsq8o6zPwsPmztLDx9TattTJz8r2tPrC67340NC4xL34o6yx49PQwcvPwsPmtcS0+sLro7o8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;">#include
#define Add1(a,b) (a+b) #define Add2(a,b) (a) + (b) #define Mul(a,b) (a*b) int main() { std::cout<
结果输出:
上述结果表明,即使是整体加上括号或者分别单独加上括号都不能很好的解决问题,最完备的解决方案就是不要吝啬你的括号,用完备的括号完备的保护每一个宏参数,也就是说,针对上述案例,应该这样:
#define Add(a,b) ((a)+(b))
#define Mul(a,b) ((a)*(b))
2.使用宏的时候,参数不能变化
首先,照例我们还是来看一段问题代码:
#include#define CUBE(a) ((a)*(a)*(a)) inline int Cube(int a) { return a*a*a; } int main() { int base1 = 2,base2=2; int nCube1 = CUBE(++base1); int nCube2 = Cube(++base2); std::cout<<"nCube1 = "<
再看一下输出结果:
其实这样的结果也很好理解,因为宏是单纯的替换,每一次替换都自增了一次,这就是宏在展开时对其参数的多次取值替换所带来的副作用,为避免这种情况,最简单的方法就是保证使用宏的时候参数不能变换。
3.用大括号将宏所定义的多条表达式括起来
我们还是来看一段示例:
#includetypedef struct Cube { int x; int y; int z; }; #define INITIAL(a,b,c)\ a=1;\ b=2;\ c=3; int main() { int x,y,z; INITIAL(x,y,z); std::cout<<"x = "<
结果显示:
其实说来说去还是一个宏替换的范围问题,改正很简单,只要在宏定义的时候加上大括号就行了,其实宏是一个很强大的工具,但是我们在用的时候要格外的小心,千万不要吝啬你的括号。



