码迷,mamicode.com
首页 > 其他好文 > 详细

宏与内联函数

时间:2015-01-30 15:34:48      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

  宏的强大作用在于编译期自动为我们产生代码,可以直接用定义的字符串去替代,增加了代码的可读性。起到了函数的作用而不用去调用函数,比较高效,是用空间换取时间的作法。但是,如果使用不当也会带来问题,这里提几点注意事项。

  (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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!