相同点:
1.减少了函数调用的开销
不同点:
1.内联函数在编译时会进行语法检查,检查有没有语法错误之类的,而宏函数直接替换
2.替换发生的时期也不同,内联函数是在编译时展开,而宏函数是在预编译时展开
3.宏在处理时需要注意二意性问题(由大括号引起的语意不同,这是为什么有些宏函数会加do{…}while(0)的原因),而内联函数则不需要(因为语法和普通函数相同)
4.当函数的代码比较复杂时,所声明的内联函数在编译器实施时不一定会展开代码,而宏函数会照旧(编译器会衡量调用函数的开销以及直接展开的开销)
最后在使用内联函数时有一点需要注意:内联函数的声明和定义最好都在头文件中,因为编译器在处理内联函数时,需要在调用处直接展开函数。
比如如下代码:
inline_demo.h
#include <iostream>
using namespace std;
inline void test();
inline_demo.cpp:
#include "inline_demo.h"
inline void test()
{
cout << "inline function" << endl;
}
inline_demo1.cpp:
#include "inline_demo.h"
void func()
{
test();
}
int main()
{
func();
return 0;
}
输入g++ inline_demo.cpp inline_demo1.cpp -o demo
编译会提示错误:对‘test()’未定义的引用
。
这时我们将test()
的定义也放在头文件中,再次编译就通过了。