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

标签 c++ inline non-member-functions

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

要不要去掉.cpp文件,在头文件中实现函数?

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

Header file:

inline void foo()
{
    //some code
}

.cpp file

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

关于c++ - 如何在 C++ 中定义内联自由函数(非成员函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54705344/

相关文章:

java - GMail 不显示使用 JavaMail API 发送的电子邮件的 HTML-/Inline-部分

c++ - 为什么 std::iterator 不包含 std::prev() 作为成员函数?

C++ 运算符重载 - uni 测验答案看起来错误?

c++ - 由已移动的唯一指针管理的对象的引用会发生什么情况?

c++ - 如何在 C/C++ 中的 Windows 下对两个 Unicode 字符或字符串进行不区分大小写的比较?

c++ - 使用通配符生成 Knuth–Morris–Pratt 前缀表

c++ - 为什么即使我只使用 os api 也会自动链接 msvcrt.dll?

c - 纯c中的内联函数和数据隐藏

css - 在导航链接之后定位内联 block "Triangle"

templates - 模板上的 begin() 和 end() 自由函数重载