.inl文件在C ++中的意义

在.inl文件中声明有什么优点? 我什么时候需要使用相同的?

.inl文件从不强制,对编译器没有特别的意义。 这只是一种构build代码的方式,可以为可能读取它的人提供提示。

在两种情况下我使用.inl文件:

  • 有关内联函数的定义。
  • 有关function模板的定义。

在这两种情况下,我把函数的声明放在一个头文件中,这个文件包含在其他文件中,然后我在头文件的底部包含.inl文件。

我喜欢它,因为它将接口从实现中分离出来,并使头文件更容易阅读。 如果你关心实现细节,你可以打开.inl文件并阅读它。 如果你不这样做,你不需要。

Nick Meyer是正确的:编译器不关心你包含的文件的扩展名,所以诸如“.h”,“.hpp”,“.hxx”,“.hh”,“.inl” “.inc”等是一个简单的约定,以清楚说明文件应该包含什么。

最好的例子是没有任何扩展名的STL头文件。

通常,“.inl”文件包含内联代码(因此是“.inl”扩展名)。

这些文件“.inl”文件是必要的,当你有一个依赖循环之间的标题代码。

例如:

 // A.hpp struct A { void doSomethingElse() { // Etc. } void doSomething(B & b) { b.doSomethingElse() ; } } ; 

和:

 // B.hpp struct B { void doSomethingElse() { // Etc. } void doSomething(A & a) { a.doSomethingElse() ; } } ; 

你不可能编译它,包括使用前向声明。

然后解决scheme将定义和实现分解为两种头文件:

  • hpp头部声明/定义
  • inl头部执行

其中分解成以下例子:

 // A.hpp struct B ; struct A { void doSomethingElse() ; void doSomething(B & b) ; } ; 

和:

 // A.inl #include <A.hpp> #include <B.hpp> inline void A::doSomethingElse() { // Etc. } inline void A::doSomething(B & b) { b.doSomethingElse() ; } 

和:

 // B.hpp struct A ; struct B { void doSomethingElse() ; void doSomething(A & a) ; } ; 

和:

 // B.INL #include <B.hpp> #include <A.hpp> inline void B::doSomethingElse() { // Etc. } inline void B::doSomething(A & a) { a.doSomethingElse() ; } 

这样,您可以在自己的源代码中包含任何需要的“.inl”文件,并且它将起作用。

同样,包含文件的后缀名称并不重要,只有它们的用途。

由于没有人提到它:

使用.inl文件来存储内联函数对于加快编译速度非常有用。

如果你只在需要声明的地方包含声明(.h),并且只包含你需要它们的内联实现(.inl)(也许只在.cpp和其他.inl文件中,而不是在.h中),它可以有一个对你的头文件依赖性有有益的影响。

这可能是一个很大的项目与许多互动类的胜利。

根据我的经验,.inl文件用于定义内联函数。 当他们在.inl文件中时,可以将文件包含在头文件中以获取内联函数,并在.c文件中获取常规函数定义。

通过这种方式,相同的源代码可以更轻松地与不具有内联函数支持的编译器以及编译器一起工作。

它们通常用于直接的C代码,而不是经常使用C ++代码,因为所有的C ++编译器都支持内联函数。

我相信这只是一个“头文件”的命名约定,包括内联代码。 这是.h文件可以包含定义和.inl文件包含模板所需的内联代码。

我不相信除了命名约定之外,还有什么比这个更重要的是使文件的目的清晰