您可能在一个翻译单元中多次包含此头文件。当第二次包含该文件时,该文件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
假设您的项目包含三个文件。两个头文件和一个源文件:
字符向量
#include "stdafx.h"
#include <string>
using namespace std
struct udtCharVec
{
wstring GraphemeM3;
wstring GraphemeM2;
};
字符矩阵.h
#include "CharVec.h"
struct udtCharMatrix
{
CharVec vec[4];
};
主文件
#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];
};
此扩展文件包括struct udtCharVec
. 如果向 中添加包含保护CharVec.h
,则预处理器将删除第二个定义。