繁体   English   中英

function 的内联定义 - 外部或内部链接

[英]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

在情况12中,对 function fun()的调用之一是从事务单元运行对fun()定义的引用,该事务单元的.cpp文件在编译中首先被提及,这表明inline默认具有外部链接为单一定义在两个 object 文件中都有效,而无需使用extern声明 - 在1.cpp2.cpp中注释或删除inline void fun()的定义时,编译器会抛出一个错误,即fun() has not been defined ,这意味着linker 链接了它找到的fun()的第一个定义,而调用inline void fun()的 function 使用该定义,但即使未使用该定义,它们也需要在其事务单元中存在的定义。 在这里,我相信maincalll在调用中实际使用的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM