在C ++中,我需要定义一些内联常规函数。 但是,当我在头文件中编写原型并在a.cpp文件中编写实现时,遇到“ LNK2001无法解析的外部符号”错误。
我应该删除.cpp文件并在头文件中实现该功能吗?
我正在尝试定义一些可以由其他类使用的共享非成员数学函数。
头文件:
inline void foo()
{
//some code
}
.cpp文件
//nothing
答案 0 :(得分:3)
inline
说明符的名称有些误导,因为它暗示了该函数是内联的。但是,inline
首先指定函数的链接(这也提示编译器考虑内联)。对于声明为inline
的函数,在已编译对象中不会生成可链接的符号。
因此,inline
函数仅在已定义(不仅声明)在头文件中时才有意义,头文件中可能包含许多编译单元。 inline
说明符可以防止编译器在相应的目标文件中为此函数发出多个(实际上是 any )个符号。
如果一个编译单元仅需要一次小函数,则无需在其他任何地方声明它。而且,您不需要内联声明它,而是将其放置在匿名名称空间中以防止它可见(在生成的目标文件中)。
所以,(这很可能是您的用例)
// 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();
答案 1 :(得分:0)
如果要使函数内联,则必须在标题中提供定义。如果您将其放在单独的cpp文件中,则不会内联。链接错误通常是由于在链接阶段未包含cpp文件。