在C++中,我需要定义一些内联通用函数,但是当我在头文件中编写原型,在. cpp文件中编写实现时,我遇到了“LNK2001 unresolved external symbol”错误。我应该删除.cpp文件并在头文件中实现该函数吗?我正在尝试定义一些共享的非成员数学函数,这些函数可以被其他类使用。头文件:
inline void foo() { //some code }
.cpp档桉
//nothing
1l5u6lss1#
inline说明符的名称有点误导,因为它暗示函数是内联的。然而,inline prefestly指定了函数的链接(它也是编译器考虑内联的一个提示)。对于声明为inline的函数,在编译的对象中不会生成可链接符号。因此,inline函数只有在头文件中有 defined(不仅仅是声明)时才有意义,头文件可能包含许多编译单元。inline说明符than防止编译器在相应的目标文件中为该函数发出多个(实际上是 any)符号。如果一个编译单元只需要一个小函数,那么就不需要在其他地方声明它,而且也不需要内联声明它,而是将它放在匿名名称空间中,以防止它(在生成的目标文件中)可见。因此,要么(这很可能是您的使用情形)
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);
ne5o7dgx2#
如果你希望你的函数是内嵌的,你必须在头中提供定义。如果你把它放在一个单独的cpp文件中,它就不会是内嵌的。链接错误通常是由于在链接阶段没有包括cpp文件。
2条答案
按热度按时间1l5u6lss1#
inline
说明符的名称有点误导,因为它暗示函数是内联的。然而,inline
prefestly指定了函数的链接(它也是编译器考虑内联的一个提示)。对于声明为inline
的函数,在编译的对象中不会生成可链接符号。因此,
inline
函数只有在头文件中有 defined(不仅仅是声明)时才有意义,头文件可能包含许多编译单元。inline
说明符than防止编译器在相应的目标文件中为该函数发出多个(实际上是 any)符号。如果一个编译单元只需要一个小函数,那么就不需要在其他地方声明它,而且也不需要内联声明它,而是将它放在匿名名称空间中,以防止它(在生成的目标文件中)可见。
因此,要么(这很可能是您的使用情形)
或
ne5o7dgx2#
如果你希望你的函数是内嵌的,你必须在头中提供定义。如果你把它放在一个单独的cpp文件中,它就不会是内嵌的。链接错误通常是由于在链接阶段没有包括cpp文件。