inline关键字和宏函数的异同

来源:互联网 发布:java对称加密算法 编辑:程序博客网 时间:2024/06/16 14:08

相同点:

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()的定义也放在头文件中,再次编译就通过了。

原创粉丝点击