このヘッダー ファイルを 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 番目の定義がプリプロセッサによって削除されます。