首页 > 代码库 > 宏与内联函数
宏与内联函数
宏的强大作用在于编译期自动为我们产生代码,可以直接用定义的字符串去替代,增加了代码的可读性。起到了函数的作用而不用去调用函数,比较高效,是用空间换取时间的作法。但是,如果使用不当也会带来问题,这里提几点注意事项。
(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,在调用函数的时候会出问题。
宏与内联函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。