当我们在该类的头文件中定义一个类成员函数时,必须使用内联关键字.为什么

when we define a class member function in header file of that class then inline keyword must be used. why?

本文关键字:成员 函数 关键字 为什么 一个 我们 文件 定义      更新时间:2023-10-16

我在头文件中定义了一个类,并在同一个头文件中实现了它的功能。但是在定义这些函数时,我必须将内联关键字与函数定义放在一起。否则编译器给出编译时错误。

我知道内联只是对编译器的一个提示。那么为什么有必要将内联关键字与函数定义放在一起。

我正在使用带有qt的Visual Studio编译器来编译代码

这是代码

温度线.h

#ifndef TEMPINLINE_H
#define TEMPINLINE_H
#include "iostream"
class tempinline
{
public:
    tempinline();
    void printH();
};
void tempinline::printH()
{
    std::cout << "hhhh";
}
#endif // TEMPINLINE_H

温度线.cpp

#include "tempinline.h"
tempinline::tempinline()
{
}

主.cpp

#include <iostream>
#include "tempinline.h"
using namespace std;
int main()
{
    tempinline aa;
            aa.printH();
    cout << "Hello World!" << endl;
    return 0;
}

错误

OUT:debugtempinline.exe @C:UsersutradeAppDataLocalTemp8tempinline.exe.8256.687.jom
LINK : debugtempinline.exe not found or not built by the last incremental link; performing full link
tempinline.obj : error LNK2005: "public: void __thiscall tempinline::printH(void)" (?printH@tempinline@@QAEXXZ) already defined in main.obj
debugtempinline.exe : fatal error LNK1169: one or more multiply defined symbols found
jom: C:Usersutradebuild-tempinline-Desktop-DebugMakefile.Debug [debugtempinline.exe] Error 1169
jom: C:Usersutradebuild-tempinline-Desktop-DebugMakefile [debug] Error 2
18:36:20: The process "C:Qtqtcreator-3.0.0binjom.exe" exited with code 2.
Error while building/deploying project tempinline (kit: Desktop)
When executing step 'Make'

经过大量尝试,我能够编译我的代码我在 tempinline .cpp 中注释代码,并注释构造函数timeinline();声明。所以这里发生的事情是,当我在一个项目中多次包含头文件时,编译器会看到void tempinline::printH()函数的多个定义。因此,编译器无法知道要链接哪个函数,并且给出了链接器错误。

但是,如果我们使用inline void tempinline::printH()函数指定内联关键字,那么由于内联关键字的行为,编译器不必将函数中的代码替换(内联属性)链接到

将调用的位置