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

rsl1atfo  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(93)

在C++中,我需要定义一些内联通用函数,但是当我在头文件中编写原型,在. cpp文件中编写实现时,我遇到了“LNK2001 unresolved external symbol”错误。
我应该删除.cpp文件并在头文件中实现该函数吗?
我正在尝试定义一些共享的非成员数学函数,这些函数可以被其他类使用。
头文件:

inline void foo()
{
    //some code
}

.cpp档桉

//nothing
1l5u6lss

1l5u6lss1#

inline说明符的名称有点误导,因为它暗示函数是内联的。然而,inline prefestly指定了函数链接(它也是编译器考虑内联的一个提示)。对于声明为inline的函数,在编译的对象中不会生成可链接符号。
因此,inline函数只有在头文件中有 defined(不仅仅是声明)时才有意义,头文件可能包含许多编译单元。inline说明符than防止编译器在相应的目标文件中为该函数发出多个(实际上是 any)符号。
如果一个编译单元只需要一个小函数,那么就不需要在其他地方声明它,而且也不需要内联声明它,而是将它放在匿名名称空间中,以防止它(在生成的目标文件中)可见。
因此,要么(这很可能是您的使用情形)

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

ne5o7dgx2#

如果你希望你的函数是内嵌的,你必须在头中提供定义。如果你把它放在一个单独的cpp文件中,它就不会是内嵌的。链接错误通常是由于在链接阶段没有包括cpp文件。

相关问题