我刚刚在this item中注意到Google C++ Coding Style Guide - 而且我不太清楚。
如果我将内联方法或函数放在除其他文件所包含的标题之外的文件中,它将不是该类的方法;它只能用于包含它的代码。那么为什么甚至会有这样的-inl.h文件呢?
另外,为什么我们甚至想要内联长函数呢? (即,在模板的情况下,当我们必须将代码放在头文件中进行实例化时)
答案 0 :(得分:11)
我刚刚在Google C ++编码风格指南中注意到这个项目 - 而且我还不太明白。
请用少许盐来取指导。许多指南旨在帮助与Google的遗留代码库进行交互,对于一般的C ++开发并不是特别好的建议。
那么为什么要有这样的
-inl.h
个文件?
没有特别好的理由;我自己不这样做。有些人喜欢它们,因为它最大限度地减少了主头文件中的内容数量,标题的用户通常希望阅读这些内容,并将实现细节分开,这些内容通常并不关心。
另外,为什么我们甚至想要内联长函数呢?
有时,我们必须:模板定义必须在实例化模板的任何翻译单元中可用,因此它们(通常)需要位于标题中。
有时,我们希望:通过在标题中实现内联函数,我们不必担心为它构建和链接单独的翻译单元。这可以使分发库更方便;可能以更长的构建时间为代价。
答案 1 :(得分:8)
这通常用于长功能模板。常规标头my_functions.h
仅包含声明,实现文件my_functions-inl.h
包含实现。原因是函数模板cannot be put in .cpp文件。请注意,X.h文件包含X-inl.h文件,而不是相反。
其他库有不同的命名约定:例如一些Boost库使用.hpp作为模板头,使用.ipp作为模板实现文件。
答案 2 :(得分:1)
根据最新的Google编码样式,不再允许使用 https://google.github.io/styleguide/cppguide.html#Variable_Names
建议将模板和内联函数的定义与其声明放置在同一文件中。这些构造的定义必须包含在使用它们的每个.cc文件中,否则程序可能无法在某些构造配置中链接。如果声明和定义在不同的文件中,则前者应可传递地包括后者。不要将这些定义移动到单独包含的头文件(-inl.h)中;过去这种做法很普遍,但现在不再允许。