即使放入头文件c ++,也无法内联函数

时间:2012-03-20 20:26:32

标签: c++ linker inline

我无法列出成员函数。我的代码如下:

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:未解析的外部符号“public:int __thiscall Foo :: myInlinedFunc(int)”(?myInlinedFunc @ Foo @@ QAEHH @ Z)在函数_wmain中引用   1> E:\ Debug \ Tester.exe:致命错误LNK1120:1个未解析的外部

我搜索了谷歌的答案,但是显示的唯一答案告诉我,我应该将内联关键字放在已经存在的头文件中。

4 个答案:

答案 0 :(得分:10)

您需要将函数体(即定义)放在头文件中。

您的标题需要像这样阅读:

<强> foo.h中

class Foo
{
public:
    Foo(void);
    ~Foo(void);
    inline int myInlinedFunc(int value)
    {
        return value * value;
    }
};

当然,您还必须从myInlinedFunc中删除Foo.cpp的定义。

或者,如果您愿意,可以像这样编写标题代码:

<强> foo.h中

class Foo
{
public:
    Foo(void);
    ~Foo(void);
    int myInlinedFunc(int value);
};

inline int Foo::myInlinedFunc(int value)
{
    return value * value;
}

但最重要的是,如果您需要内联函数并且可供其他翻译单元使用,则必须将其定义放在头文件中。

C++ FAQ解释了这一点,甚至预测了未解决的外部错误。

答案 1 :(得分:0)

如果要共享内联函数(可在其所在类之外使用),则该函数必须进入标题。它不需要进入标题的顶部。把它放在类声明之外但是在同一个* .h文件中。

答案 2 :(得分:0)

如果要将它们内联,则需要为编译器提供函数定义的来源。您可以将其保留在标题中,也可以将其包含在标题中包含的.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。

答案 3 :(得分:-1)

你可以做2种方法之一

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

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

  3. #include "Foo.cpp"

    在Foo.cpp中,将此行添加到文件顶部

    #include "Foo.h"