【问题标题】:Corret way to set up inline function设置内联函数的正确方法
【发布时间】:2017-11-16 00:30:30
【问题描述】:

我想在 C++ 中定义一个内联函数。比如这个函数的头文件fun.h我有

#ifndef FUN_H
#define FUN_H

void fun(int);

#endif // FUN_H

在源文件fun.cpp我有

#include "fun.h"

inline void fun(int a){
    return ++a;
}

我知道这是定义内联函数的一种方式,但我确实看到很多人说内联函数的实现应该直接在头文件fun.h中,这意味着以下模式,

#ifndef FUN_H
#define FUN_H

inline void fun(int a){
    return ++a;
}

#endif // FUN_H

但是,我不想将所有代码挤在一起,所以我这样编码,

#ifndef FUN_H
#define FUN_H

void fun(int);

inline void fun(int a){
    return ++a;
}
#endif // FUN_H

这是一种正确的样式,因此可以将函数视为内联函数吗?

顺便说一句,有人告诉我,如果我将内联函数的定义放在源文件中,可能会导致链接时出现“未定义引用”问题。我确实遇到过一次这个问题,解决方法是删除源文件中的“inline”关键字。但是,仍然有一些函数在源文件中具有内联关键字的定义。这个函数没有触发任何链接错误,所以我现在对使用“inline”关键字的正确方法感到困惑。

有人对此有什么想法吗?

【问题讨论】:

  • 当你有函数定义本身时,你不需要函数的原型。当你这样做时你不应该遇到链接问题,inline 关键字特别意味着每个编译单元都可以拥有自己的函数副本。
  • 这让我更加困惑,因为当我在 .cpp 文件中的函数之前删除“inline”关键字时,链接错误消失了。它说“未定义对函数的引用......”但我检查了我是如何使用该函数的,还检查了我是否包含了头文件。他们是正确的,但我一直有链接错误,直到我删除了“内联”关键字。

标签: c++ inline header-files


【解决方案1】:

inline 关键字告诉编译器该函数可以在多个编译单元中定义,只要所有定义完全相同。而已。不多也不少。

这意味着标记在 .cpp 文件 inline 中定义的函数实际上并没有做任何事情,除非您打算手动将该定义复制/粘贴到多个 .cpp 文件中(您显然应该这样做不做)。

至于有与没有单独的声明:这完全是风格问题。我觉得它是多余的,但是有些人喜欢前向声明他们的所有函数,这样他们就不必担心如果某些函数调用其他函数,他们就不必担心以正确的顺序定义它们。

【讨论】:

  • 很好的答案! “强迫症”是逼着我用单独声明的风格。它看起来很整洁......
  • 非常感谢您的回答。
【解决方案2】:

您可以从他们的official documentation 中了解 C++ 中的内联函数,

何时使用 -

函数可以根据程序员的需要进行内联。下面提到了一些有用的建议-

  1. 需要性能时使用内联函数。
  2. 在宏上使用内联函数。
  3. 更喜欢在函数定义的类之外使用 inline 关键字来隐藏实现细节。

另外值得一提的是same这个地方,

优点:-

...

  1. 通过将其标记为内联,您可以将函数定义放在头文件中(即它可以包含在多个编译单元中,而不会引起链接器的抱怨)

缺点:-

...

  1. 在标头中使用时,它会使您的标头文件更大,其中包含用户不关心的信息。

我所做的是,由于函数很小(应该如此),因此将其包含在这样的头文件中

#ifndef FUN_H
#define FUN_H

inline void fun(int a) { return ++a; }

#endif // FUN_H

因此,您不会被函数定义所淹没,并且可以读取函数而无需滚动太多,也可以跳过问题中提到的编译问题。

【讨论】:

  • 感谢您的回复,我会阅读那些材料。我记得类中的成员函数默认被认为是内联的,所以我认为在它们之前添加“内联”实际上是多余的。
  • 是的,你是对的,我对作为类成员的内联函数只字未提。
  • 如果您得到帮助,我们将不胜感激:)
猜你喜欢
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多