关于内联函数

来源:互联网 发布:windows recv返回值 编辑:程序博客网 时间:2024/05/22 13:28

看c++primer时看到一句话“把内联函数放到头文件中”。当时看了后觉的挺奇怪,如果把内联函数放到头文件中 岂不是在链接时要报错?因为会产生重复定义的错误。

但是测试了下面的代码:

test.h

#ifndef  ___TEST_H_

#define ___TEST_H_

#include<iostream>

inline void print()

{

std::cout<<"Hello"<<std::endl;

}

#endif

test1.cpp

#include"test.h"

test2.cpp

#include"test.h"

int main()

{

return 0;

}

没有报错,也就是说test1.o和test2.o中没有相同的符号print。所以链接时才没有产生错误。

后来又进一步考虑,除非inline函数在定义时是局部的,也就是带有static功能才能保证不会引起重复定义的错误。

但是接着又进行了下面的测试:

test.h

#ifndef  ___TEST_H_

#define ___TEST_H_

#include<iostream>

inline void print();

#endif


test1.cpp

#include"test.h"

inline void print()

{

std::cout<<"Hello"<<std::endl;

}


test2.cpp

#include"test.h"

int main()

{

print();

return 0;

}

这个时候报错了,错误原因是print 符号无法解析。

也就是说编译完成后 在test1.o中没有print 的函数体,才会导致链接时 test2.o中的print无法定位。

所以经过上面的测试 得到一个结论,也就是 内联函数在编译时就进行了符号替换,也就是在调用内联函数的地方用函数体进行了替代。而函数在编译后就没有了,这样也就避免了过程调用 可以加快程序的运行。所以如果要在多个源文件中使用同一内联函数最好的办法就是在头文件中定义该内联函数,否则就要在不同的源文件中都要定义该内联函数了。