首页 > 解决方案 > 如何在 C++ 中定义内联自由函数(非成员函数)?

问题描述

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

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

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

头文件:

inline void foo()
{
    //some code
}

.cpp 文件

//nothing

标签: c++inlinenon-member-functions

解决方案


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

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

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

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

// 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();

推荐阅读