首页 > 代码库 > 宏与内联函数

宏与内联函数

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

  (1)用宏定义表达式时,要使用完备的括号。

  因为宏只是简单的字符替换,宏的参数如果是复合结构,那么替换之后要是不用括号保护宏参数,可能会因为操作符的优先级问题,得到意料之外的结果。例如:

1 #define ADD(a,b)  a+b2 #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,在调用函数的时候会出问题。

宏与内联函数