我什么时候应该使用-inl.h文件?

ein*_*ica 9 c++ inline header header-files

我刚刚在Google C++编码风格指南中注意到了这个项目 - 我并不太明白.

如果我将内联方法或函数放在除其他文件包含的标题之外的文件中,它将不是该类的方法; 它只能用于包含它的代码.那么为什么甚至会有这样的-inl.h文件呢?

另外,为什么我们甚至想要内联长函数呢?(即,除了模板的情况,我们必须将代码放在头文件中进行实例化)

Mik*_*our 11

我刚刚在Google C++编码风格指南中注意到了这个项目 - 我并不太明白.

用一撮盐来取指导.许多指南旨在帮助与Google的遗留代码库进行交互,对于一般的C++开发并不是特别好的建议.

那么为什么甚至还有这样的-inl.h文件呢?

没有特别好的理由; 我自己不这样做.有些人喜欢它们,因为它最大限度地减少了主标题文件中的内容数量,标题的用户通常希望读取这些内容,并将实现细节分离出来,而这些细节通常并不关心.

另外,为什么我们甚至想要内联长函数呢?

有时,我们必须:模板定义必须在实例化模板的任何翻译单元中可用,因此它们(通常)需要在标题中.

有时,我们希望:通过在标题中实现内联函数,我们不必担心为它构建和链接单独的翻译单元.这可以使分发库更方便; 可能以更长的构建时间为代价.


Tem*_*Rex 8

这通常用于长函数模板.常规头my_functions.h只包含声明,实现文件my_functions-inl.h包含实现.原因是函数模板不能放在.cpp文件中.请注意,Xh文件包含X-inl.h文件,而不是相反.

其他库具有不同的命名约定:例如,一些Boost库使用.hpp作为模板头,使用.ipp作为模板实现文件.


Hil*_*ill 5

According to latest Google coding style, it is no longer allowed https://google.github.io/styleguide/cppguide.html#Variable_Names

最好将模板和内联函数的定义与其声明放在同一文件中。这些构造的定义必须包含在使用它们的每个 .cc 文件中,否则程序可能无法在某些构建配置中链接。如果声明和定义位于不同的文件中,则包含前者应传递包含后者。不要将这些定义移至单独包含的头文件 (-inl.h);这种做法过去很常见,但现在已不再允许。