即使放入标头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 ++也无法内联函数的主要内容,如果未能解决你的问题,请参考以下文章

直接调用间接调用和内联调用

C++ 为啥要引入内联函数、、

函数所需的堆栈空间是否会影响C / C ++中的内联决策?

什么是内联函数

内联函数和函数重载

成员函数与内联函数