编译错误“'struct'type redefinition”虽然它是它的第一个定义

时间:2011-04-28 21:12:22

标签: c++

一切都运行良好,直到我将一些代码从主文件移到一个新类,然后我遇到以下错误:

  

错误C2011:'color1':'struct'类型重新定义

struct color1
{
    color1()
    {
        red = green = blue = 0;
    }

    color1(float _red, float _green, float _blue)
    {
        red = _red;
        green = _green;
        blue = _blue;
    }

    float red, green, blue;
};

有什么想法吗?

5 个答案:

答案 0 :(得分:51)

如果编译器说它已重新定义,则可能是。

我的通灵调试技巧告诉我你将结构从源文件移动到头文件,并忘记该标题中的包含警戒,然后在源文件中多次包含。

编辑:作为一般规则,我通常建议避免引导下划线。在某些情况下(例如后跟大写字母),它们是为实现保留的,最简单的是永远不要使用前导_而不是希望你记住所有规则。

答案 1 :(得分:15)

从上面的片段我无法推断出有些不对劲。

但通常这个错误意味着您多次包含相同的头文件。你不忘记为包含文件添加标准防护吗?

#ifndef MY_HEADER_FILE_
#define MY_HEADER_FILE_

// here is your header file code

#endif

答案 2 :(得分:4)

您可以在头文件中定义结构。 有

 #pragma once

在定义结构的头部的开头,它解决了问题。

答案 3 :(得分:0)

我遇到了同样的问题,幸运的是并没有花很长时间就发现这只是一个愚蠢的错误。

问题是,我在另一个驱动器(D :)上备份了我的项目,但是所有代码都在驱动器C:上进行了设置(显式定义了完整路径)。我在C:路径上创建它,并且一直使用这种方式,但是不小心从D打开了项目,并认为它是同一件事,因此在编译时它包含了两次,因为在某些情况下,它包含了来自C的代码。 C:路径,D:路径处的其他路径。

答案 4 :(得分:0)

我也遇到了同样的问题,结果我的头球后卫犯了一个错误。例如,而不是写:

#ifndef COMMAND_H
#define COMMAND_H

// My code

#endif // COMMAND_H

我有点难以识别错别字:

#ifndef COMNAND_H
#define COMMAND_H

// My code

#endif // COMMAND_H

也就是说,COMNAND_H 不是 COMMAND_H。应该是字母 M 而不是字母 N。我解决了这个问题,一切都很好。希望这个答案能帮助你解决你的问题!!!