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

sha*_*oth 7 c++ compiler-construction linker inline

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

void function()
{
}
Run Code Online (Sandbox Code Playgroud)

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

inline void function()
{
}
Run Code Online (Sandbox Code Playgroud)

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

但是如果由于任何原因,包括使用预处理器,那些实例碰巧有不同的实现,链接器将再次选择其中一个函数,开发人员甚至不知道哪个被选中,直到他彻底测试他的程序.

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

Chu*_*dad 6

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

$ 6.4/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