(我使用的是 gnu g++ v5.2.1 和 C++11,但这是一个通用的 C++ 问题。)
我想在我的 .hpp 文件中加入一些简单的方法。我项目中的许多 .cpp 文件都包含这个 .hpp 文件:
class foo
{
public:
int example1( int i ) { return i + 5; }
inline int example2( int i ) { return i + 5; }
};
example1()
和 example2()
中一个显式声明为 inline
而另一个没有提及时有区别吗内联
?
我应该更喜欢其中之一吗?
编辑:不,@HostileFork,您标记为可能重复的其他问题没有回答我的问题。
最佳答案
在类定义中包含主体的成员函数是隐式内联
,因此您的两个代码示例是相同的。
但是,如果 body 是离线提供的,那就不一样了:
class foo
{
public:
int example1( int i );
inline int example2( int i );
};
在此代码中,foo::example2
是一个内联函数。外联定义必须也出现在 header 中(除非该函数永远不会odr-used)。外联定义是否还包括 inline
说明符是可选的。
对于foo::example1
,如果存在带有inline
说明符的外联定义,则该函数是inline
。同样,如果存在这样的定义,那么它必须在 header 中,除非该函数永远不会odr-used。
这些 ODR 违规是未定义的行为,不需要诊断。在实践中,这可能意味着它可能“看起来有效”,或者给出链接错误。
通常,您只会使用我的 example2
案例,您希望函数定义出现在标题中,但您认为将类定义紧凑和函数体放在后面更易读。
在这种情况下,我建议在声明和定义中都使用inline
,以增强可读性。
Windows 编程注意事项:如果类被标记为 __declspec(dllexport)
或 __declspec(dllimport)
,则 gcc 会警告 示例 1
。我不确定这里的正确行为是什么,但为了避免任何可能的问题,请在声明中使用 inline
。
关于c++ - 我的 C++ 内联方法是否应该显式声明为内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36298312/