【问题标题】:Why my inline functions have linking error?为什么我的内联函数有链接错误?
【发布时间】:2020-04-07 23:17:25
【问题描述】:

我正在学习 C++,目前正在测试内联函数。如果我现在运行我的代码,我将遇到链接错误,但如果我更改
inline void Test::print40()void Test::print40() 一切都会好的。您能否向我解释一下为什么我会出错以及在这种情况下如何使用内联函数。

// main.cpp file
#include "Test.h"
using namespace std;

int main()
{
    Test obj1;
    obj1.print40();
}
// Test.cpp file
#include <iostream>
#include "Test.h"

inline void Test::print40()
{
    std::cout << "40";
}
// Test.h file
#pragma once

class Test
{
public:
    void print40();
};

【问题讨论】:

    标签: c++ function class inline-functions


    【解决方案1】:

    内联函数定义应在使用 ODR 的每个编译单元中。

    另一方面,在您的项目中,编译单元 main 不知道该函数是内联函数。所以找不到它的定义。

    将此定义从Test.cpp移开

    #pragma once
    
    class Test
    {
    public:
        void print40();
    };
    
    inline void Test::print40()
    {
        std::cout << "40";
    }
    

    到标题Test.h

    模块Test.cpp 是冗余的。

    由于该函数非常简单简短,因此可以在类定义中定义,例如

    class Test
    {
    public:
        void print40()
        {
            std::cout << "40";
        }
    };
    

    在这种情况下,默认情况下它将是一个内联函数。

    【讨论】:

    • ничё не понял, если я в определении класса перед void print40(); допишу inline ничего не поменяется
    • @Denis 正如我所说,内联函数的定义应在每个编译模块中。如果您将 inline 说明符放在类定义内的函数声明中,则不会更改任何内容。 main.cpp 中没有该函数的定义。所以把函数的定义移到表头,
    • @Denis ODR - 一个定义规则。
    • как расшифровуется ODR?
    • @Denis 在这个论坛你必须用英文写 cmets。
    猜你喜欢
    • 2012-10-02
    • 2012-03-07
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多