内联函数链接更改

时间:2011-11-16 03:02:26

标签: 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;
}

第二个:

int main(){
  extern void f1(int a,int b);
  f1(1,2);
}

g ++ frist.cc second.cc

undefined reference to `f1(int, int)'

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


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

#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);
}

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

2 个答案:

答案 0 :(得分:5)

  

这里发生了什么?

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

如果编译器决定内联函数,那么它将发出一个实际的函数定义(就好像该函数未被内联声明),具有弱链接(因此多个这样的定义可以不会引起问题)。 正在发生什么,以及你的程序链接的原因。

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

答案 1 :(得分:4)

在C ++中,如果某个函数被定义为 inline 某处,那么无处不在

来自C ++ 7.1.2

内联函数应在每个使用它的翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)

3.2 是指一个定义规则

所以你遇到的是非C ++标准行为