0

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

我知道内联只是对编译器的提示。那么为什么有必要在函数定义中加入 inline 关键字。

我正在使用带有 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()
{
}

主文件

#include <iostream>
#include "tempinline.h"

using namespace std;

int main()
{
    tempinline aa;
            aa.printH();
    cout << "Hello World!" << endl;
    return 0;
}

错误

OUT:debug\tempinline.exe @C:\Users\utrade\AppData\Local\Temp\8\tempinline.exe.8256.687.jom
LINK : debug\tempinline.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
debug\tempinline.exe : fatal error LNK1169: one or more multiply defined symbols found
jom: C:\Users\utrade\build-tempinline-Desktop-Debug\Makefile.Debug [debug\tempinline.exe] Error 1169
jom: C:\Users\utrade\build-tempinline-Desktop-Debug\Makefile [debug] Error 2
18:36:20: The process "C:\Qt\qtcreator-3.0.0\bin\jom.exe" exited with code 2.
Error while building/deploying project tempinline (kit: Desktop)
When executing step 'Make'
4

1 回答 1

0

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

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

于 2015-06-12T20:03:25.200 回答