如何在C 中定义无线功能(非成员函数)

How to define an inline free function (non member function) in C++?

本文关键字:功能 成员 函数 定义      更新时间:2023-10-16

在C 中,我需要定义一些内联函数。但是,当我在标头文件中编写原型和在A.CPP文件中的实现时,我会遇到" LNK2001未解决的外部符号"错误。

我可以删除.cpp文件并在标题文件中实现函数吗?

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

标题文件:

inline void foo()
{
    //some code
}

.cpp文件

//nothing

inline指定符的名称有些误导,因为它表明该函数被嵌入。但是,inline最不端的指定功能的链接(这也是对编译器的提示要考虑内线)。对于声明inline的函数,在编译对象中没有生成可连接的符号。

因此,inline仅在标题文件中定义(不仅是声明)时才有意义,该文件可能包含在许多汇编单元中。inline指示符比编译器在相应对象文件中发出的此功能的多个(实际上)符号。

如果您只需要一个较小的函数才能用于一个编译单元,则无需在其他任何地方声明它。此外,您无需在线声明它,而是将其放在匿名名称空间中以防止其可见(在生成的对象文件中)。

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

// foo.hpp:
inline void foo(bar x) { /* ... */ }  // full definition
// application.cpp:
#include "header.hpp"
/* ... */ foo(X);

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

如果您希望函数在线,则必须在标题中提供定义。如果您将其放在单独的CPP文件中,则不会在衬里。链接错误通常是由于在链接阶段期间不包括CPP文件。