c++编译器抱怨重定义结构体

C++ Compiler Complaining About Redefined Struct

本文关键字:定义 结构体 编译器 c++      更新时间:2023-10-16

我有一些代码。该代码有四个文件。一个文件是主文件,另外三个是所有结构(即"游戏"结构、"玩家"结构和"场景"结构)。在游戏结构中,我尝试着创造一系列"场景"结构。编译器抱怨说"重新定义结构'scene'"。任何帮助吗?

第一条建议

确保在每个header中包含header警卫,以防止重新包含:

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED
...whatever was in game.h before...
#endif /* GAME_H_INCLUDED */

其他头文件也一样。

很可能你的一个报头包含了另一个,这导致了重定义问题——因为报头保护缺失了。

一些编译器支持#pragma once,以确保它只包含一次给定的头文件。如果你将要使用的所有编译器都支持它,你可以使用pragma来代替所示的可移植和可靠的机制;但是,您必须自担风险。


第二个建议

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

在游戏结构中,我尝试制作一系列"场景"结构。编译器抱怨说"重新定义结构体'scene'"。

听起来好像你必须做这样的事情:

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];
    ...
};

但是如果多个源文件要使用相同的结构,那么这些东西真的应该放在头文件中;否则你就违反了敏捷开发信条的两个准则(尽管实际上它们是通用的"优秀编程"规则):

  • DRY: Don't Repeat Yourself
  • SPOT:单点真相

如果不止一个源文件包含struct game(或struct scene,或struct player)的定义,那么您就是在重复自己(不好,特别是当您必须更改定义时,并且没有一个地方可以查找struct game(或struct scene,或struct player)的定义。

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


如果问题仍然存在

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

之后,开始消除错误之前的材料。继续下去,直到没有一行代码可以在编译过程中删除而不丢失错误。

在这一点上,如果测试用例少于40行,那么您就可以将一些东西放入您的问题中。在那之前,你做得还不够好。(注意,你不需要任何注释;它很简单,不需要任何东西就能理解。

这就是你追踪任何麻烦的bug的方式——尽可能快地消除尽可能多的代码,只留下麻烦的东西。