消息关闭
    暂无新消息!
今天重新温习了一下inline函数的用法,于是在机器上试验了一下,发现一些问题,直接上代码。
我编辑了两个cpp文件,分别是main.cpp和foo.cpp,两个文件中都有调用foo这个内联函数。

//main.cpp
#include <iostream>                                                                                                                                                                      
using namespace std;
 void foo2();
 inline void foo()
 {
     cout << "hello";
 }
  
 int main()
 {
     foo();
     foo2();
 }


//foo.cpp
#include <iostream>
 using namespace std;
      
 inline void foo()
 {    
      cout << "world";                                                                                                                                                                     
 }    
 void foo2()
 {    
       foo();
 } 

按理讲不是说两个文件中的内联函数定义需要一样,不然编译会不通过吗?可是我编译是正常的,而且运行后结果是hellohello,也就是foo.cpp中的内联函数被pass了,求大佬们解释。

4个回答

︿ 2
我又试着在两个函数前加了static,限定作用范围,结果输出是hello world。
︿ 0
折腾了一下午,终于研究明白这个问题了。出现这个问题的根源在于编译的时候没有加优化选项,默认时-O0,不展开inline。而两次定义由于时inline的,所以不会出现重复定义的错误。在链接时由于时从左到右查找符号定义,并且取第一个找到的符号位置,因此调用foo时,均调用main中的定义(如果链接时调换两个目标文件的顺序,输出worldworld)。而我编译的时候定义-O1,那么最后结果就是helloworld所希望的。
折腾了这么久,用inline函数的时候一定要谨慎。一个是要加优化选项,因为默认的选项是不展开inline的。再就是最好保证各个编译模块中内联函数功能一致(最好定义在头文件中)。否则的话,会出现一些不好解释的问题。