标签:
宏的强大作用在于编译期自动为我们产生代码,可以直接用定义的字符串去替代,增加了代码的可读性。起到了函数的作用而不用去调用函数,比较高效,是用空间换取时间的作法。但是,如果使用不当也会带来问题,这里提几点注意事项。
(1)用宏定义表达式时,要使用完备的括号。
因为宏只是简单的字符替换,宏的参数如果是复合结构,那么替换之后要是不用括号保护宏参数,可能会因为操作符的优先级问题,得到意料之外的结果。例如:
1 #define ADD(a,b) a+b 2 #define ADD(a,b) (a+b) 3 #define ADD(a,b) (a)+(b)
如果执行ADD(a,b)*ADD(c,d),本意是执行(a+b)*(c+d),但是三种定义得到的结果分别是,
1、a+b*c+d
2、(a+b)*(c+d)
3、(a)+(b)*(c)+(d)
(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++);//nsquare1 = 100.nvlaue2 = 11
类似的定义,结果却不同,两处的a都被nValue1++替换,执行了两次的自增运算。要注意宏只是字符替换问题,在使用时要用避免自增运算符这种参数替换带给程序的不确定性。
在C++里面内联函数模板起到了和宏一样的作用,都是把相应的代码直接插入调用的位置,它既有宏的高效性,又比宏安全。
1 template <typename T> 2 inline T Add(const T& a,const T& b) 3 { 4 return (a+b); 5 }
但是这又会带来参数类型不确定的影响,如果a=2,b=3.0,在调用函数的时候会出问题。
标签:
原文地址:http://www.cnblogs.com/wangnianbing/p/4262172.html