当内联函数的不同实现链接到一个可执行文件时,情况如何?

时间:2010-11-10 11:25:01

标签: c++ compiler-construction linker inline

根据一个定义规则(ODR)我不能有一个功能

void function()
{
}

在一个可执行文件中定义了多次 - 链接器将对象。但是内联函数会忽略ODR:

inline void function()
{
}

可以在一个头文件中定义,该头文件将被#included到多个.cpp文件中,因此当结果.obj文件链接在一起时,链接器会看到该函数的几个实例并故意忽略它。它 假设它是完全相同的函数 并且仅使用其中一个实例。由于程序行为得以保留,无人关心。

但是如果感谢任何原因,use of preprocessor included,那些实例碰巧有不同的实现,链接器将再次选择其中一个函数,开发人员甚至不会知道哪一个被选中,直到他彻底测试他的程序

当链接器选择其中一个函数并且碰巧有不同的实现分类后,后一种情况如何?这是未定义的行为还是其他任何情况?

1 个答案:

答案 0 :(得分:6)

是的,具有外部链接的内联函数是UB(我认为这是OP的意图)。

$ 3.2 / 5-

  

可以有多个定义   类的类型(第9条),   枚举类型(7.2),内联   具有外部联动功能   (7.1.2),课堂模板(第14条),   非静态函数模板(14.5.5),   类模板的静态数据成员   (14.5.1.3),类的成员函数   模板(14.5.1.1)或模板   专门化为哪些模板   参数未指定(14.7,   14.5.4)在程序中规定每个定义出现在不同的中   翻译单位,并提供   定义满足以下要求   要求。

     

给定这样一个名为D的实体   在多个翻译单元中,   那么

     

- D的每个定义都应该   由相同的序列组成   令牌;和

最后的同一段指出,未能满足这些要求会导致UB