根据单一定义规则(ODR)我不能有一个函数
void function()
{
}
在一个可执行文件中定义多次 - 链接器将反对。然而,内联函数的 ODR 被忽略:
inline void function()
{
}
可以在头文件中定义,该头文件将被 #included 到多个 .cpp 文件中,因此当生成的 .obj 文件链接在一起时,链接器会看到该函数有多个实例,并故意忽略它。它假设它是完全相同的函数并且只使用其中一个实例。由于程序行为被保留,所以没人关心。
但如果由于某种原因,包括预处理器的使用,这些实例碰巧有不同的实现,链接器将再次选择其中一个函数,开发人员甚至不知道选择了哪一个,直到他彻底测试了他的程序。
当链接器选择其中一个函数并且它们碰巧有不同的实现分类时,后一种情况如何?这是未定义的行为还是任何其他类型的情况?
是的,它是具有外部链接的内联函数的 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)