首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止递归C#

防止递归C#
EN

Stack Overflow用户
提问于 2010-01-11 21:43:26
回答 7查看 1.8K关注 0票数 8

我大致理解了使用C预处理器所做的#include做什么规则,但我并不完全理解它。现在,我有两个头文件,Move.h和Board.h,这两个文件都是属于它们各自的类型(Move和Board)。在两个头文件中,我需要引用在另一个头文件中定义的类型。

现在,我在Board.h中有#include " Move.h“,在move.h中包含"Board.h”。但是,当我编译时,gcc翻了一下,给了我一个长的(看起来是无限递归的)错误消息,在Move.h和Board.h之间翻转。

如何包含这些文件,使我不会无限期地递归地包含这些文件?

EN

Stack Overflow用户

发布于 2010-01-11 22:39:36

循环依赖是一个痛苦的问题,应该在可行的情况下消除。除了到目前为止给出的前瞻性声明建议(Alok是最好的例子)之外,我还想提出另一个建议:打破董事会之间的相互依赖,引入第三种类型(请将其命名为BoardMoveAssoc;我相信您可以想出一个不那么糟糕的名称):

代码语言:javascript
运行
复制
#ifndef H_BOARD_MOVE_ASSOC
#define H_BOARD_MOVE_ASSOC

#include "Move.h"
#include "Board.h"

struct BoardMoveAssoc {
    Move m;
    Board b;
};

...
#endif

在此方案下,委员会和移动不必相互了解任何信息;两者之间的任何关联都由BoardMoveAssoc类型管理。确切的结构将取决于移动和董事会应该如何关联;例如,如果多个移动被映射到一个单板上,结构看起来可能更像

代码语言:javascript
运行
复制
 struct BoardMoveAssoc {
     Move m[NUM_MOVES] // or Move *m;
     Board b;
 };

这样,您就不必担心前向声明或不完整的类型。您正在引入第三种类型的混合,但我相信这将更容易理解和维护。

票数 0
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2045159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档