在.inl文件中声明有什么好处?我什么时候需要使用相同的?
答案 0 :(得分:123)
.inl
文件永远不是必需的,对编译器没有特殊意义。它只是构建代码的一种方式,它为可能读取它的人提供了一个提示。
我在两种情况下使用.inl
个文件:
在这两种情况下,我将函数的声明放在头文件中,其中包含其他文件,然后我#include
头文件底部的.inl
文件。
我喜欢它,因为它将接口与实现分开,使得头文件更容易阅读。如果您关心实现细节,可以打开.inl
文件并阅读它。如果不这样做,则不必。
答案 1 :(得分:79)
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() ;
}
} ;
你无法编译,包括使用前向声明。
然后解决方案是将定义和实现分解为两种头文件:
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”文件,它将起作用。
同样,包含文件的后缀名称并不重要,只有它们的用途。
答案 2 :(得分:30)
由于没有人提及它:
使用.inl文件存储内联函数对于加快编译速度非常有用。
如果只包含需要声明的声明(.h),并且只包含需要它们的内联实现(.inl)(即可能仅在.cpp和其他.inl文件中,而不是.h's),可以对您的标头依赖项产生有益的影响。
对于具有许多交互类的大型项目来说,这可能是一次重大胜利。
答案 3 :(得分:3)
根据我的经验,.inl文件用于定义内联函数。当它们位于.inl文件中时,该文件可以包含在标题中以获取内联函数,也可以包含在.c文件中以获取常规函数定义。
这样,相同的源代码可以更容易地使用没有内联函数支持的编译器以及编译器。
它们通常与直接C代码一起使用,通常不使用C ++代码,因为所有C ++编译器都支持内联函数。
答案 4 :(得分:1)
我认为这只是“标题”文件的命名约定,包括内联代码。 这样.h文件可以包含定义,而.inl文件包含模板所必需的内联代码。
我不相信除了命名约定之外还有更多内容可以使文件的目的明确