![](/img/trans.png)
[英]Is there any practical difference between an inline function having internal and external linkage, with compiler optimization?
[英]inline definition of function - external or internal linkage
在以下交易单元中:
//1.cpp
#include<iostream>
extern void calll();
inline void fun()
{
std::cout<<"in fun 1\n";
}
int main()
{
fun();
calll();
return 0;
}
//2.cpp
#include<iostream>
inline void fun()
{
int i=123; //random un-used variable
char c= 99; //random un-used variable
std::cout<<"in fun 2\n";
}
void calll()
{
fun();
}
**案例 1 -> ** 像g++ 1.cpp 2.cpp
那样编译它 output 是: in fun 1 in fun 1
**case 2 -> ** 用g++ 2.cpp 1.cpp
编译它是: in fun 2 in fun 2
在情况1和2中,对 function fun()
的调用之一是从事务单元运行对fun()
定义的引用,该事务单元的.cpp
文件在编译中首先被提及,这表明inline
默认具有外部链接为单一定义在两个 object 文件中都有效,而无需使用extern
声明 - 在1.cpp或2.cpp中注释或删除inline void fun()
的定义时,编译器会抛出一个错误,即fun() has not been defined
,这意味着linker 链接了它找到的fun()
的第一个定义,而调用inline void fun()
的 function 使用该定义,但即使未使用该定义,它们也需要在其事务单元中存在的定义。 在这里,我相信main
或calll
在调用中实际使用的fun
定义具有外部链接笼 - 因为没有为各个 object 文件生成内联(单独的定义)。
如果上述观察结果属实,那么为什么编译器在使用单个定义时需要在单个 object 文件中进行定义? 是不是因为如果文件以案例 1或案例 2的方式编译,当使用-O2
编译时,函数仍然有可能被内联,并且每个 object 文件都必须使用他们自己的inline void fun()
定义inline void fun()
?
究竟什么能保证 function 是否内联?
您的示例实际上违反了单一定义规则。 简而言之,使用inline
function 您可以拥有多个定义,前提是每个定义:
所以这实际上是UB。
inline
函数要求在使用 ODR 的每个翻译单元中都有定义,因此它们可以在 header 中完全定义,例如无需编译单元。
这与“内联”function 不同。 inline
仅意味着 function 被定义为与其声明“内联”。 任何 function 将根据您的编译器自行决定是否内联。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.