内联函数(inline)
宏函数的缺陷
- 宏定义和宏函数在预处理阶段中,只是做单纯地替换,不进行其他操作,不会出现在编译过程,有时候不严谨地定义会导致意想不到的错误。
- 无作用域
- 无数据类型
.h
#define mYAdd( x, y ) x + y
.cpp
qDebug()<<"mYAdd(10,20)*3:"<<mYAdd(10,20)*3;
.h
#define mYAdd( x, y ) ( x + y )
.cpp
qDebug()<<"mYAdd(10,20)*3:"<<mYAdd(10,20)*3;
从上述操作可以看出,宏函数和宏定义只是在预处理阶段将相关的代码替换了而已,会出现很对问题,所以
宏定义尽量使用const关键字,宏函数则使用内联函数
内联函数的引出
内联函数相较于普通函数来说,不会有入栈和出栈的操作,调用时更有效率。
(但是编译器是否采纳操作人员的意见,将操作员所声明的函数变成内联函数对待,有相关几条注意事项)
定义形式(在函数声明前加上inline关键字):
inline void fucntion(.....) {..}
.h
inline int add(int a,int b)
{
return a+b;
}
.cpp
qDebug()<<"inline-add效果:"<<add(10,20);//正常调用即可
内联函数的定义放置于.h文件中
类内部的内联函数
任何在类内部定义的函数,符合条件,均可自动变成内联函数。
内联函数和编译器
C++对内联函数有一定的限制,以下情况编译器可能考虑不会将函数进行内联编译。
- 不能存在任何形式的循环语句
- 不能存在过多的条件判断语句
- 函数体不能过于庞大
- 不能对函数进行取址操作
内联函数仅仅是操作人员给编译器的一个建议,编译器不一定会接受这种建议,如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。一个好的编译器将会内联小的,简单的函数。