(我正在使用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
而另一个未提及inline
时,它们之间是否存在差异?
我应该更喜欢一个吗?
编辑:不,@ HostileFork,您标记为可能重复的其他问题不会回答我的问题。
答案 0 :(得分:3)
在类定义中包含其主体的成员函数是隐式inline
,因此您的两个代码示例是相同的。
然而,如果身体是在线外提供的话会有所不同:
class foo
{
public:
int example1( int i );
inline int example2( int i );
};
在此代码中,foo::example2
是内联函数。外联定义必须也出现在标题中(除非该函数永远不会 odr-used )。可选的是,外部定义是否还包括inline
说明符。
对于foo::example1
,如果有inline
说明符的外联定义,则函数为inline
。同样,如果存在这样的定义,那么它必须在标题中,除非函数永远不会 odr-used 。
这些ODR违规是未定义的行为,无需诊断。在实践中,这可能意味着它可能“似乎工作”,或者给出链接错误。
通常情况下,您只使用我希望函数定义出现在标题中的example2
情况,但您认为稍后将类定义设置为紧凑且函数体更具可读性。
在这种情况下,我建议在声明和定义中使用inline
,以提高可读性。
Windows编程注意事项:如果课程标记为__declspec(dllexport)
或__declspec(dllimport)
,则gcc会警告example1
。我不确定这里的正确行为是什么,但为了避免任何可能的问题,请在声明中使用inline
。
答案 1 :(得分:1)
默认情况下,类中定义的成员函数是内联的。
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#note-38
答案 2 :(得分:0)
我认为这取决于C ++编译器的选项。如果优化级别很高,一些微小的函数将被优化为内联。
在您的情况下,函数example2非常简单,关键字inline将起作用。例如,如果优化级别很高,则可以将其编译为内联,但这取决于编译器的行为。如果禁用了优化选项,则它不是内联函数。
在我看来,关键字inline是对编译器的建议,如果函数很复杂,它可能不起作用。