内联函数
语法:在函数定义前添加inline关键字
注意:是在函数定义前添加,在声明前添加无效
1、内联函数的作用
先看下面这段代码
首先宏定义了一个函数,作用是 a 与 b 的值相乘,显而易见,输出结果为a = 10,b = 20,sum = 200。
现在我们将a 和 b的值改为a+b后 printf("%d\n",MUL(a+b,a+b)); 结果是什么呢?预想中应该为30*30 = 900,a = 30,b = 30,sum = 900,可是并不是这样
输出结果为
为什么会这样呢?将a+b 带入宏定义中为 a+b*a+b
只要你小学数学合格不难看出这个式子中b*a先运算,而后a加上其的乘积,最后加b。而我们的目的是让 a+b的和 与 a+b的和 相乘。所以在我们定义的宏函数中,编译器无法区分先运算的优先,需要我们自行加括号。
所以正确的宏函数定义为:#define MUL(a,b) (a)*(b)
下面就用内联函数进a*b这个运算,代码如下
输出结果:
1
1)内联函数在编译期间进行代码替换 编译完成后是没有函数体的,避免函数调用,节省了函数入栈出栈跳转等开销
2)内联是一种请求,有可能会被编译器拒绝
3)内联成功后,是没有函数体 即不能对函数进行取地址 内联函数不能作为回调函数使用
限制(函数时间开销不要太大)
1)不要有任何形式的循环语句
2)不要特别复杂的判断语 eg:if
3)函数体不要太大 最好不要超过五行
一般来说,推荐用 内联函数 替换 宏函数。