内联函数链接更改

use*_*und 4 c++ linker inline

我刚刚创建了两个文件来测试内联函数的链接,第一个

#include <iostream>
using namespace std;
inline int f1(int a,int b){
  a=a+b;
  while(a!=0)
    a--;
  cout<<"inline";
  return a;
}
Run Code Online (Sandbox Code Playgroud)

第二个:

int main(){
  extern void f1(int a,int b);
  f1(1,2);
}
Run Code Online (Sandbox Code Playgroud)

g ++ frist.cc second.cc

undefined reference to `f1(int, int)'
Run Code Online (Sandbox Code Playgroud)

链接器引发错误,因为我希望内联函数是默认的内部链接,所以结果是正确的.


但是,当我将内联函数的调用函数添加到第一个文件时:

#include <iostream>
using namespace std;
inline int f1(int a,int b){
  a=a+b;
  while(a!=0)
    a--;
  cout<<"inline";
  return a;
}
int callf1(){
  f1(10,2);
}
Run Code Online (Sandbox Code Playgroud)

并再次编译,它通过,并且可以无误地运行,所以我想问这里发生了什么?

Emp*_*ian 5

这里发生了什么?

当编译器编译内联函数时,它可以选择内联或不内联,具体取决于一些启发式方法,以及当前优化级别.这inline只是一个建议,编译器可以随意忽略.

如果编译器决定内联函数,那么它将发出一个实际的函数定义(就好像该函数未被内联声明),具有弱链接(因此多个这样的定义不会导致问题).这就是正在发生的事情,以及您的计划链接的原因.

如果您提高优化级别,或者使用具有不同内联启发式的编译器,您的程序可能会停止链接.