1

我创建了一个包含以下内容的新 .h 文件:

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

struct udtCharVec
{
    wstring GraphemeM3;
    wstring GraphemeM2;
};

当我想编译它时,编译器告诉我“错误 C2011:udtCharVec:结构类型重新定义”。

我进行了文本搜索,但在其他任何地方都没有定义“struct udtCharVec”。

有人看到我哪里出错了吗?

4

3 回答 3

5

您可能在一个翻译单元中多次包含此头文件。当第二次包含该文件时,该文件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,则预处理器将删除第二个定义。

于 2013-05-26T09:37:27.043 回答
2

在头文件的顶部添加这个宏

#pragma once
于 2019-05-27T07:16:49.130 回答
0

通常,此类问题在“输出”窗格中具有附加信息(而“错误列表”仅获取第一行),您只需单击即可转到上一个定义。

如果它转到相同的位置,那么确实您已经多次包含该文件 - 您可以打开 C++/advanced 下的显示包含选项,以查看所有包含在它们发生时列出的内容。

大多数 .h 文件应包含保护或 #pragma 一次以避免此类错误。

此外,您不应在头文件中执行 #include "stdafx.h" - 这应在 .cpp 文件的开头完成(次优)或在项目中指定为强制包含。

于 2013-05-26T13:23:38.750 回答