我刚刚创建了两个文件来测试内联函数的链接,第一个是
#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);
}
再次编译,它通过了,并且可以无误地运行,所以我想问一下这里发生了什么?
答案 0 :(得分:5)
这里发生了什么?
当编译器编译内联函数时,它可以选择内联或不内联,具体取决于启发式数量,以及当前优化级别。 inline
只是一个建议,编译器可以随意忽略。
如果编译器决定不内联函数,那么它将发出一个实际的函数定义(就好像该函数未被内联声明),具有弱链接(因此多个这样的定义可以不会引起问题)。 那正在发生什么,以及你的程序链接的原因。
如果您提高优化级别,或者使用具有不同内联启发式的编译器,您的程序可能会停止链接。
答案 1 :(得分:4)
在C ++中,如果某个函数被定义为 inline 某处,那么无处不在
来自C ++ 7.1.2
内联函数应在每个使用它的翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)
3.2 是指一个定义规则
所以你遇到的是非C ++标准行为