我知道inline关键字仅是编译器的提示,而不是强制的(除非在MSVC中使用__forceinline)。

在标头中声明内联函数时也是如此吗?编译器会将代码放在哪个编译单元中?

最佳答案

inline不仅仅是对编译器的提示。

内联函数可以在多个转换单元中定义,并且所有这些定义将具有相同的类型,地址和定义。

如果在标头中定义了函数,则必须将其声明为inline,否则当它包含在多个转换单元中时,它将违反“一个定义规则”。

内联函数是:


可以使用关键字inline内联声明全局范围内的函数。
完全在class / struct / union定义内定义的函数(无论是成员函数还是非成员Friend函数)始终是内联的。
声明为constexpr的函数始终是内联的。


source

在标头中声明内联函数时,是否也[inline是一个提示]?

是。 inline关键字始终是编译器执行“内联”的提示。

但是,请注意,这仅是一个提示。编译器可以自由地忽略它(很多人会忽略)。

编译器能够对内联函数执行内联的真正原因是整个定义都可用。您会注意到static函数和实例化函数模板的内联。

编译器会将代码放在哪个编译单元中?

链接之前,内联函数将在定义它的任何编译单元中完全定义。它将完整地编译到每个目标文件中。

在链接期间,链接器将确定要使用的定义,并丢弃所有其他定义。

另请参见this question及其答案。

关于c++ - 当方法主体位于头文件中时,是否强制执行内联?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30350811/

10-15 00:33