内联函数链接

我无法理解以下行为:一个头部带有一些基本types,另一个头部使用这些types的几个函数。 之后,我开始根据自己定义的types和function构build类。 在函数头中,如果我留下以下签名:

void whateverFunction(parameters) 

链接器指出有任何函数有多个定义。 现在,如果将其更改为:

 inline void whateverFunction(parameters) 

联动问题消失了,所有的编译链接都很好。 我所知道的内联就是用它的代码代替了每个函数调用,而不是它是非常黑暗的,所以我的问题是:

链接器如何处理C ++中的内联函数?

当标题中的函数不是内联的时候,这个函数的多个定义(例如多个翻译单元)就违反了ODR规则。

内联函数默认具有外部链接。 因此,由于ODR规则(下面给出),这种多重定义(例如在多个翻译单元中)是好的:

$ 3.2 / 5-“类types(第9章),枚举types(7.2), 带外部链接的内联函数 (7.1.2),类模板(第14章),非静态函数模板(14.5.6),类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1),或没有指定一些模板参数的模板特化类(14.7,14.5.5)如果每个定义出现在不同的翻译单元中,并且提供的定义满足以下要求:给定一个名为D的实体定义在多个翻译单元中,则

– D的每个定义应由相同的令牌序列组成; 和[…]

链接器如何处理内联函数是一个相当多的实现级别的细节。 只要知道实施在ODR规则的限制范围内接受这样的多重定义即可

请注意,如果标题中的函数声明更改为“静态内联…”,则内联函数明确地具有内部链接,并且每个翻译单元都具有它自己的静态内联函数副本。

链接器可能根本看不到内联函数。 它们通常是直接编译成调用它们的代码(即代码被用来代替函数调用)。

如果编译器select不内联函数(因为它只是一个提示),我不知道,但我认为编译器发出它作为一个正常的非内联函数,并以某种方式注释它,所以链接器只是select第一个副本它看到和忽略了其他人。

内联只是掩盖了问题。 有多个定义指出某个地方的问题。

Juste要小心你如何使用你的标题。 不要忘记: – << #ifndef HEADER_NAME / #define HEADER_NAME / #endif >>以避免多重包含。 – 不要使用间接包含:如果在文件中使用types,则添加相应的标题,即使同一文件中的另一个标题包含它也是如此。