如果头文件包含函数定义,则编译器可以内联它.如果导出该函数,则在链接期间还必须使客户端可以使用该函数的名称和实现.编译器如何实现这一目标?它是否内联函数并为外部调用者提供实现?
考虑Foo.h:
class Foo
{
int bar() { return 1; }
};
Foo :: bar可以在库foo.so中内联或不内联.如果另一段代码包含Foo.h它是否总是创建自己的Foo :: bar副本,无论是否内联?
最佳答案 头文件只是复制粘贴到源文件中 – 这都是#include.如果使用该关键字声明函数或者在类定义中定义函数,则函数只是内联函数,并且内联只是一个提示;它不会强制编译器生成不同的代码或禁止您执行任何其他操作.
您仍然可以获取内联函数的地址,或者等效地,如您所述,导出它.对于这些用途,编译器只是将其视为非内联,并使用One Definition Rule(表示用户不能将两个定义应用于同一函数,类等的规则)来“确保”该函数仅定义一次且仅导出一个副本.通常,您只能在所有来源中使用一个定义;内联函数必须具有一个定义,该定义在每个使用的源中都会重复.
以下是关于内联外部函数(7.1.2 / 4)的标准:
An inline function shall be defined in
every translation unit in which it is
used and shall have exactly the same
definition in every case (3.2). [Note:
a call to the inline function may be
encountered before its defi- nition
appears in the translation unit. ] If
a function with external linkage is
declared inline in one transla- tion
unit, it shall be declared inline in
all translation units in which it
appears; no diagnostic is required. An
inline function with external linkage
shall have the same address in all
translation units. A static local
variable in an extern inline function
always refers to the same object. A
string literal in an extern inline
function is the same object in
different translation units.