在 C++ 中,我需要定义一些内联通用函数。但是,当我在头文件中编写原型并在 a.cpp 文件中编写实现时,遇到“LNK2001 未解析的外部符号”错误。
我应该删除.cpp文件并在头文件中实现该功能吗?
我正在尝试定义一些其他类可以使用的共享非成员数学函数。
头文件:
inline void foo()
{
//some code
}
.cpp 文件
//nothing
在 C++ 中,我需要定义一些内联通用函数。但是,当我在头文件中编写原型并在 a.cpp 文件中编写实现时,遇到“LNK2001 未解析的外部符号”错误。
我应该删除.cpp文件并在头文件中实现该功能吗?
我正在尝试定义一些其他类可以使用的共享非成员数学函数。
头文件:
inline void foo()
{
//some code
}
.cpp 文件
//nothing
说明符的名称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();
如果您希望您的函数是内联的,您必须在标题中提供定义。如果您将其放在单独的 cpp 文件中,则不会内联。链接错误通常是由于在链接阶段未包含 cpp 文件。