gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:52:12 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com