在 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/