【问题标题】:Unable to inline functions even if put in header c++即使放入标头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,您承诺在同一个翻译单元中提供定义,但未能兑现承诺。你期待什么?

标签: c++ linker 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 解释了这一点,甚至预测了您的未解决的外部错误。

【讨论】:

  • 但如果我不想这样做 - 由于编码布局和可读性?
  • 这很难。如果您希望它内联,并且可以从另一个翻译单元获得,您必须将定义放在标题中。
  • 我看不出有什么矛盾。
  • 好的,我明白了,我还是要把它放在同一个头文件中。
【解决方案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 种方法中的一种

      1. 将内联函数的定义(在您的示例中为 myInlinedFunc)放在头文件中

      2. 如果要将函数的定义放在另一个文件中,请在头文件末尾添加以下行

      #include "Foo.cpp"

      在 Foo.cpp 中,在文件顶部添加这一行

      #include "Foo.h"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-30
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2016-09-04
        相关资源
        最近更新 更多