根据一个定义规则(ODR)我不能有一个功能
void function()
{
}
在一个可执行文件中定义了多次 - 链接器将对象。但是内联函数会忽略ODR:
inline void function()
{
}
可以在一个头文件中定义,该头文件将被#included到多个.cpp文件中,因此当结果.obj文件链接在一起时,链接器会看到该函数的几个实例并故意忽略它。它 假设它是完全相同的函数 并且仅使用其中一个实例。由于程序行为得以保留,无人关心。
但是如果感谢任何原因,use of preprocessor included,那些实例碰巧有不同的实现,链接器将再次选择其中一个函数,开发人员甚至不会知道哪一个被选中,直到他彻底测试他的程序
当链接器选择其中一个函数并且碰巧有不同的实现分类后,后一种情况如何?这是未定义的行为还是其他任何情况?
答案 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