0

ヘッダー ファイルでクラスを定義し、その関数を同じヘッダー ファイルに実装しました。しかし、これらの関数を定義している間、関数定義でインラインキーワードを配置する必要があります。それ以外の場合、コンパイラはコンパイル時エラーを出しました。

インラインはコンパイラへのヒントにすぎないことを知っています。では、なぜ関数定義に inline キーワードを入れる必要があるのでしょうか。

コードをコンパイルするために、qtでビジュアルスタジオコンパイラを使用しています

ここにコードがあります

tempinline.h

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

#endif // TEMPINLINE_H

tempinline.cpp

#include "tempinline.h"

tempinline::tempinline()
{
}

main.cpp

#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 キーワードを指定するとinline void tempinline::printH()、コンパイラは、関数内にあるコードの置換 (インライン プロパティ) により、呼び出される場所にこの関数をリンクする必要はありません。

于 2015-06-12T20:03:25.200 に答える