c++编译器抱怨重定义结构体
C++ Compiler Complaining About Redefined Struct
我有一些代码。该代码有四个文件。一个文件是主文件,另外三个是所有结构(即"游戏"结构、"玩家"结构和"场景"结构)。在游戏结构中,我尝试着创造一系列"场景"结构。编译器抱怨说"重新定义结构'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的方式——尽可能快地消除尽可能多的代码,只留下麻烦的东西。
- 如何将c结构体定义转换为c++
- 如何声明在不同命名空间中定义的结构体
- P/在结构体中调用定义长度的C char*数组
- 定义要在包含的头文件中访问的结构体的正确方法
- 使用结构体作为参数:错误:结构体未定义
- 返回指向类定义的结构体的指针,多个作用域操作符
- c++编译器抱怨重定义结构体
- 访问结构体中定义的枚举的值
- 如何在单独的头文件中定义结构体中的char*数组?
- 访问结构体中定义的枚举值
- 定义错误结构体中的枚举
- 结构体的重新定义错误.头文件的问题
- 使用QGLShaderProgram从Qt传递自定义类型(结构体)统一到GLSL
- 在定义充满成员的结构体时,是否为该结构体类型的每个变量创建这些成员?
- 自定义结构体与之交互,就好像它是int型一样
- 使用已定义结构体的vector到达未初始化内存
- 如何在c++中(非cli)将自定义结构体传递给_variant_t
- int型到自定义结构体的转换
- 如何在c++中初始化自定义结构体的动态数组
- 在flex错误c++中定义结构体