【问题标题】:inline function linkage change内联函数联动变化
【发布时间】:2011-12-30 01:49:28
【问题描述】:

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

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

再次编译,通过,可以正常运行,请问这里发生了什么?

【问题讨论】:

    标签: c++ linker inline


    【解决方案1】:

    这里发生了什么?

    当编译器编译内联函数时,它可能会选择内联或不内联,这取决于许多启发式方法和当前的优化级别。 inline 只是一个建议,编译器可以随意忽略。

    如果编译器决定内联函数,那么它将发出一个实际的函数定义(就像函数没有声明内联一样),具有弱链接(因此多个这样的定义可以不会造成问题)。 是发生了什么,以及为什么你的程序链接。

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

    【讨论】:

    • 在有内联函数的调用函数时添加了一个弱符号,见:00000000 **W** _Z2f1ii
    【解决方案2】:

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

    来自 C++ 7.1.2

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

    3.2指的是单一定义规则

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

    【讨论】:

    • 好的,我用-std=c++98再试一次,还是通过了……为什么?
    • 在 c++98 的 9.2 中...它声明禁止外部链接和内联的组合以简化编译器编写者的工作
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2014-10-18
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多