首页 文章

即使放入 Headers c,也无法内联函数

提问于
浏览
1

我无法内联成员函数 . 我的代码如下:

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

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

    你的 Headers 需要像这样读:

    Foo.h

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

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

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

    Foo.h

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

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

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

  • 0

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

  • -1

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

  • 10

    你可以做2种方法之一

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

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

    #include "Foo.cpp"

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

    #include "Foo.h"

相关问题