1

次の内容の新しい .h ファイルを作成しました。

#include "stdafx.h"
#include <string>
using namespace std;

struct udtCharVec
{
    wstring GraphemeM3;
    wstring GraphemeM2;
};

コンパイルしようとすると、コンパイラから「エラー C2011: udtCharVec: 構造体型の再定義」と表示されます。

テキスト検索を行いましたが、他に「struct udtCharVec」が定義されていません。

誰かが私がどこで間違ったのか見ていますか?

4

3 に答える 3

5

このヘッダー ファイルを 1 つの翻訳単位に複数回インクルードしている可能性があります。ファイルが 2 回目にインクルードされると、struct udtCharVecは既に定義されているため、「型の再定義」エラーが発生します。

インクルード ガードを追加します。最初のインクルードの後、CharVec_Hが定義されるため、ファイルの残りの部分はスキップされます。

#ifndef CharVec_H
#define CharVec_H
#include "stdafx.h"
#include <string>
using namespace std

struct udtCharVec
{
    wstring GraphemeM3;
    wstring GraphemeM2;
};
#endif

プロジェクトが 3 つのファイルで構成されているとします。2 つのヘッダー ファイルと 1 つのソース ファイル:

CharVec.h

#include "stdafx.h"
#include <string>
using namespace std

struct udtCharVec
{
    wstring GraphemeM3;
    wstring GraphemeM2;
};

CharMatrix.h

#include "CharVec.h"
struct udtCharMatrix
{
    CharVec vec[4];
};

main.cpp

#include "CharVec.h"
#include "CharMatrix.h"

int main() {
    udtCharMatrix matrix = {};
    CharVec vec = matrix.vec[2];
};

プリプロセッサが実行された後、main.cpp は次のようになります (標準ライブラリのインクルードは無視します)。

//#include "CharVec.h":
    #include "stdafx.h"
    #include <string>
    using namespace std

    struct udtCharVec //!!First definition!!
    {
        wstring GraphemeM3;
        wstring GraphemeM2;
    };
//#include "CharMatrix.h":
    //#include "CharVec.h":
        #include "stdafx.h"
        #include <string>
        using namespace std

        struct udtCharVec //!!Second definition!!
        {
            wstring GraphemeM3;
            wstring GraphemeM2;
        };
    struct udtCharMatrix
    {
        CharVec vec[4];
    };

int main() {
    udtCharMatrix matrix = {};
    CharVec vec = matrix.vec[2];
};

この拡張ファイルには、 の 2 つの定義が含まれていますstruct udtCharVec。インクルード ガードを に追加するCharVec.hと、2 番目の定義がプリプロセッサによって削除されます。

于 2013-05-26T09:37:27.043 に答える
0

通常、このような問題には [出力] ペインに追加情報があり (エラー リストは最初の行のみを取得します)、クリックするだけで前の定義に移動できます。

同じ場所に移動する場合は、実際にファイルが数回含まれています。C++/advanced の下にある Show includes オプションをオンにして、すべてのインクルードが発生したときに一覧表示されるようにすることができます。

.h ファイルの大部分は、このようなエラーを回避するためにガードまたは #pragma once を含める必要があります。

また、ヘッダー ファイルで #include "stdafx.h" を実行しないでください。これは、.cpp ファイルの開始時に実行するか (準最適)、プロジェクトで強制インクルードとして指定する必要があります。

于 2013-05-26T13:23:38.750 に答える