我有一些代码。代码有四个文件。一个文件是主文件,另外三个是所有结构(即“游戏”结构,“播放器”结构和“场景”结构)。在游戏结构中,我尝试制作一组“场景”结构。编译器抱怨说“重新定义结构'场景'”。有什么帮助吗?
答案 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];
...
};
但是,如果多个源文件将使用相同的结构,那么这些东西确实属于标题;否则你违反了敏捷开发信条的两个规范(虽然实际上它们是通用的'良好规划'规则):
如果您的多个源文件包含struct game
(或struct scene
或struct player
)的定义,那么您将重复自己(不好,尤其是当您需要更改时)定义,并且没有一个地方可以查找struct game
(或struct scene
或struct player
)的定义。
头文件是控制C ++开发复杂性的关键。
如果这还没有找到你的问题,那么你很难猜到你做了什么。您需要显示显示问题的最小代码。获取任何文件失败的副本,并调用新文件minimal.cpp
(或任何新名称,并带有相应的文件后缀)。现在编辑minimal.cpp
。除了在语法上完成名称空间或结构所需的内容之外,无情地抛弃错误之后的所有内容。您可以通过策略性地放置#if 0
和#endif
对,或使用全面删除来实现。每次更改后,保存文件,检查是否仍然得到相同的编译错误。如果您使用#if 0 / #endif
注释掉代码,那么在编译失败后,删除该代码块(并再次保存,然后再次检查编译)。尾随材料通常很容易处理;你只需要一些适当放置的紧密括号和分号。
之后,您会在错误发生之前开始消除材料。继续前进,直到没有一行代码可以移除而不会在编译期间丢失错误。
此时,如果测试用例不足40行,您可以在问题中加入一些内容。在那之前,你做得还不够好。 (请注意,您在repro中不需要任何注释;它很简单,无需任何注释。)
这是如何跟踪任何麻烦的错误 - 尽可能快地消除尽可能多的代码,让你只有麻烦的东西。