我大致理解了使用C预处理器所做的#include做什么规则,但我并不完全理解它。现在,我有两个头文件,Move.h和Board.h,这两个文件都是属于它们各自的类型(Move和Board)。在两个头文件中,我需要引用在另一个头文件中定义的类型。
现在,我在Board.h中有#include " Move.h“,在move.h中包含"Board.h”。但是,当我编译时,gcc翻了一下,给了我一个长的(看起来是无限递归的)错误消息,在Move.h和Board.h之间翻转。
如何包含这些文件,使我不会无限期地递归地包含这些文件?
发布于 2010-01-11 22:39:36
循环依赖是一个痛苦的问题,应该在可行的情况下消除。除了到目前为止给出的前瞻性声明建议(Alok是最好的例子)之外,我还想提出另一个建议:打破董事会之间的相互依赖,引入第三种类型(请将其命名为BoardMoveAssoc;我相信您可以想出一个不那么糟糕的名称):
#ifndef H_BOARD_MOVE_ASSOC
#define H_BOARD_MOVE_ASSOC
#include "Move.h"
#include "Board.h"
struct BoardMoveAssoc {
Move m;
Board b;
};
...
#endif在此方案下,委员会和移动不必相互了解任何信息;两者之间的任何关联都由BoardMoveAssoc类型管理。确切的结构将取决于移动和董事会应该如何关联;例如,如果多个移动被映射到一个单板上,结构看起来可能更像
struct BoardMoveAssoc {
Move m[NUM_MOVES] // or Move *m;
Board b;
};这样,您就不必担心前向声明或不完整的类型。您正在引入第三种类型的混合,但我相信这将更容易理解和维护。
https://stackoverflow.com/questions/2045159
复制相似问题