设置内联函数的正确方法

Corret way to set up inline function

我想在 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 并没有真正做任何事情,除非您打算手动 copy/paste 该定义到多个 .cpp文件(你显然不应该这样做)。

至于有还是没有单独的声明:这完全是风格问题。我发现它是多余的,但有些人喜欢前向声明他们所有的功能,这样他们就不必担心在某些调用其他功能时以正确的顺序定义它们。

您可以从他们的 official documentation of inline function in c++ 中获得概述,

When to use -

Function can be made as inline as per programmer need. Some useful recommendation are mentioned below-

  1. Use inline function when performance is needed.
  2. Use inline function over macros.
  3. Prefer to use inline keyword outside the class with the function definition to hide implementation details.

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

Pros :-

...

  1. By marking it as inline, you can put a function definition in a header file (i.e. it can be included in multiple compilation unit, without the linker complaining)

Cons :-

...

  1. When used in a header, it makes your header file larger with information which users don’t care.

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

#ifndef FUN_H
#define FUN_H

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

#endif // FUN_H

因此您不会被函数定义所淹没,并且可以在不滚动太多的情况下阅读函数,也可以跳过您在问题中提到的编译问题。