在.inl文件中声明的好处是什么?什么时候需要使用?
在.inl文件中声明的好处是什么?什么时候需要使用?
Answers:
.inl
文件永远不是必需的,并且对编译器没有特殊意义。这只是一种结构化代码的方式,向可能阅读该代码的人员提供了提示。
我.inl
在两种情况下使用文件:
在这两种情况下,我都将函数的声明放在其他文件包含的头文件中,然后#include
将.inl
文件放在头文件的底部。
我喜欢它,因为它使接口与实现分开,并使头文件更易于阅读。如果您关心实现细节,则可以打开.inl
文件并阅读。如果不这样做,则不必。
.tcc
用于模板实现文件。
glm
使用.hpp和.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() ;
}
} ;
您无法对其进行编译,包括使用前向声明。
然后,解决方案是将定义和实现分解为两种头文件:
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”文件,它将起作用。
同样,包含文件的后缀名称并不是很重要,只是它们的用途。
If the function were not inline, you would you standard .cpp file for the implementation part?
::可能。模板是通常无法隐藏在.CPP文件中的代码示例,因此在这种情况下,.INL文件将是必需的。
由于没有人提到它:
使用.inl文件存储内联函数对于加速编译很有用。
如果仅在需要声明的地方包含声明(.h),仅在需要声明的地方包含内联实现(.inl)(即可能仅在.cpp和其他.inl文件中,而不是.h),则它可以具有对您的标头依赖性的有益影响。
对于具有许多交互类的较大项目而言,这可能是一个重大胜利。
以我的经验,.inl文件用于定义内联函数。当它们位于.inl文件中时,该文件可以包含在标头中以获取内联函数,而可以包含在.c文件中以获取常规函数定义。
这样,同一源可以更轻松地与不具有内联函数支持的编译器以及具有内联函数支持的编译器一起使用。
它们通常与直接的C代码一起使用,而不是与C ++代码一起使用,因为所有C ++编译器都支持内联函数。
#define inline static
,并在标头中定义内联函数。