c++ - 我的 C++ 内联方法是否应该显式声明为内联?

标签 c++ c++11 inline

(我使用的是 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/

相关文章:

c++ - undefined symbol 首先被引用

c++ - 旋转两个球体

c++ - 在不初始化变量的情况下声明变量的最佳实践,因此 auto 不可用

c++ - const 内置类型是否在 C++ 中内联?

javascript - Firebug 无法选择脚本

c++ - C++写的Synology DSM helloworld package编译报错

c++ - 使用 std::chrono 库来调整应用程序 fps 但出现奇怪的行为

c++ - 从派生类中删除虚函数

c++ - 成员模板的别名模板

java - 解析内联 XML 架构 (Xerces for Java)