即使放入标头c ++也无法内联函数
Posted
技术标签:
【中文标题】即使放入标头c ++也无法内联函数【英文标题】:Unable to inline functions even if put in header c++ 【发布时间】:2012-03-20 20:26:31 【问题描述】:内联成员函数时遇到问题。我的代码如下:
Main.cpp
#include "Foo.h"
int _tmain(int argc, _TCHAR* argv[])
Foo foo;
int a = foo.myInlinedFunc(2);
Foo.h
class Foo
public:
Foo(void);
~Foo(void);
inline int myInlinedFunc(int value);
;
Foo.cpp
#include "Foo.h"
Foo::Foo(void)
Foo::~Foo(void)
int Foo::myInlinedFunc(int value)
return value * value;
我收到以下错误:
Tester.obj:错误 LNK2019:函数 _wmain 中引用的未解析外部符号“public:int __thiscall Foo::myInlinedFunc(int)”(?myInlinedFunc@Foo@@QAEHH@Z) 1>E:\Debug\Tester.exe : 致命错误 LNK1120: 1 unresolved externals
我已经在 google 上搜索了答案,但唯一显示的答案告诉我应该将 inline 关键字放在它已经存在的头文件中。
【问题讨论】:
通过使用inline
,您承诺在同一个翻译单元中提供定义,但未能兑现承诺。你期待什么?
【参考方案1】:
你需要将函数体,即定义,放在头文件中。
你的标题需要这样写:
Foo.h
class Foo
public:
Foo(void);
~Foo(void);
inline int myInlinedFunc(int value)
return value * value;
;
当然,您还必须从Foo.cpp
中删除myInlinedFunc
的定义。
或者,如果您愿意,可以这样编写您的标头代码:
Foo.h
class Foo
public:
Foo(void);
~Foo(void);
int myInlinedFunc(int value);
;
inline int Foo::myInlinedFunc(int value)
return value * value;
但底线是,如果您需要内联函数,并且对其他翻译单元可用,则必须将其定义放在头文件中。
C++ FAQ 解释了这一点,甚至预测了您的未解决的外部错误。
【讨论】:
但如果我不想这样做 - 由于编码布局和可读性? 这很难。如果您希望它内联,并且可以从另一个翻译单元获得,您必须将定义放在标题中。 但是这另有说明:parashift.com/c++-faq-lite/inline-functions.html#faq-9.9 我看不出有什么矛盾。 好的,我明白了,我还是要把它放在同一个头文件中。【参考方案2】:如果你想共享内联函数(在它所在的类之外可用),函数必须进入头部。它不需要进入标题的顶部。将它放在类声明之外,但在同一个 *.h 文件中。
【讨论】:
【参考方案3】:如果你想内联函数定义的源代码,编译器需要它们可用。您可以将其保留在标题中,或将其保存在包含在标题中的 .cpp 文件中。
例如,这将是 Foo.h
#ifndef Foo_h
#define Foo_h
class Foo
public:
Foo(void);
~Foo(void);
inline int myInlinedFunc(int value);
;
#include "Foo.cpp"
#endif Foo_h
你可以在 Foo.cpp 中保留函数的定义
inline int Foo::myInlinedFunc(int value)
return value * value;
要使用该类,只需在需要的地方包含 Foo.h。不需要单独编译 Foo.cpp。
【讨论】:
【参考方案4】:你可以做 2 种方法中的一种
将内联函数的定义(在您的示例中为 myInlinedFunc)放在头文件中
如果要将函数的定义放在另一个文件中,请在头文件末尾添加以下行
#include "Foo.cpp"
在 Foo.cpp 中,在文件顶部添加这一行
#include "Foo.h"
【讨论】:
以上是关于即使放入标头c ++也无法内联函数的主要内容,如果未能解决你的问题,请参考以下文章