C ++编译器抱怨重新定义的结构

时间:2011-12-03 00:34:28

标签: c++ file class struct

我有一些代码。代码有四个文件。一个文件是主文件,另外三个是所有结构(即“游戏”结构,“播放器”结构和“场景”结构)。在游戏结构中,我尝试制作一组​​“场景”结构。编译器抱怨说“重新定义结构'场景'”。有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

第一个建议

确保在每个标题中包含标题保护以防止重新包含:

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED

...whatever was in game.h before...

#endif /* GAME_H_INCLUDED */

同样适用于其他每个标题。

你的一个标题可能包含其中一个标题,这导致重新定义问题 - 因为标题保护丢失了。

某些编译器支持#pragma once以确保它只包含一次给定的标头。如果您将使用的所有编译器都支持它,您可以使用pragma而不是显示的可移植和可靠机制;但是,您这样做需要您自担风险。


第二个建议

没有标题 - 这令人费解(实际上,'担心'可能是一个更好的术语)。不同的文件如何知道不同的结构?

  

在游戏结构中,我尝试制作一组​​“场景”结构。编译器抱怨说“重新定义结构'场景'”。

听起来好像你必须做类似的事情:

struct game
{
    ...
    struct scene { ... } *next_scene;
    struct scene { ... }  list_scenes[24];
    ...
};

这是不允许的;一旦定义了结构标记一次,就无法重新定义它。最低版本是:

struct game
{
    ...
    struct scene { ... } *next_scene;
    struct scene          list_scenes[24];
    ...
};

建议的修订版(有很多警告仍然与您的组织相关):

struct game
{
    ...
    struct scene { ... };
    struct scene *next_scene;
    struct scene  list_scenes[24];
    ...
};

但是,如果多个源文件将使用相同的结构,那么这些东西确实属于标题;否则你违反了敏捷开发信条的两个规范(虽然实际上它们是通用的'良好规划'规则):

  • 干:不要重复自己
  • SPOT:单点真相

如果您的多个源文件包含struct game(或struct scenestruct player)的定义,那么您将重复自己(不好,尤其是当您需要更改时)定义,并且没有一个地方可以查找struct game(或struct scenestruct player)的定义。

头文件是控制C ++开发复杂性的关键。


如果问题仍然存在

如果这还没有找到你的问题,那么你很难猜到你做了什么。您需要显示显示问题的最小代码。获取任何文件失败的副本,并调用新文件minimal.cpp(或任何新名称,并带有相应的文件后缀)。现在编辑minimal.cpp。除了在语法上完成名称空间或结构所需的内容之外,无情地抛弃错误之后的所有内容。您可以通过策略性地放置#if 0#endif对,或使用全面删除来实现。每次更改后,保存文件,检查是否仍然得到相同的编译错误。如果您使用#if 0 / #endif注释掉代码,那么在编译失败后,删除该代码块(并再次保存,然后再次检查编译)。尾随材料通常很容易处理;你只需要一些适当放置的紧密括号和分号。

之后,您会在错误发生之前开始消除材料。继续前进,直到没有一行代码可以移除而不会在编译期间丢失错误。

此时,如果测试用例不足40行,您可以在问题中加入一些内容。在那之前,你做得还不够好。 (请注意,您在repro中不需要任何注释;它很简单,无需任何注释。)

这是如何跟踪任何麻烦的错误 - 尽可能快地消除尽可能多的代码,让你只有麻烦的东西。