如何在C ++中定义内联自由函数(非成员函数)?

时间:2019-02-15 08:37:28

标签: c++ inline non-member-functions

在C ++中,我需要定义一些内联常规函数。 但是,当我在头文件中编写原型并在a.cpp文件中编写实现时,遇到“ LNK2001无法解析的外部符号”错误。

我应该删除.cpp文件并在头文件中实现该功能吗?

我正在尝试定义一些可以由其他类使用的共享非成员数学函数。

  

头文件:

inline void foo()
{
    //some code
}
  

.cpp文件

//nothing

2 个答案:

答案 0 :(得分:3)

inline说明符的名称有些误导,因为它暗示了该函数是内联的。但是,inline首先指定函数的链接(这也提示编译器考虑内联)。对于声明为inline的函数,在已编译对象中不会生成可链接的符号。

因此,inline函数仅在已定义(不仅声明)在头文件中时才有意义,头文件中可能包含许多编译单元。 inline说明符可以防止编译器在相应的目标文件中为此函数发出多个(实际上是 any )个符号。

如果一个编译单元仅需要一次小函数,则无需在其他任何地方声明它。而且,您不需要内联声明它,而是将其放置在匿名名称空间中以防止它可见(在生成的目标文件中)。

所以,(这很可能是您的用例)

// foo.hpp:
inline void foo(bar x) { /* ... */ }  // full definition

// application.cpp:
#include "header.hpp"

/* ... */ foo();

// application.cpp:
namespace {
    inline void foo(bar x)   // inline specifier redundant
    { /* ... */ }
}

/* ... */ foo();

答案 1 :(得分:0)

如果要使函数内联,则必须在标题中提供定义。如果您将其放在单独的cpp文件中,则不会内联。链接错误通常是由于在链接阶段未包含cpp文件。