首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-11 21:45:13

您需要查看转发声明,您已经创建了包含的无限循环,前向声明是正确的解决方案。

下面是一个例子:

Move.h

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

struct board; /* forward declaration */
struct move {
    struct board *m_board; /* note it's a pointer so the compiler doesn't 
                            * need the full definition of struct board yet... 
                            * make sure you set it to something!*/
};
#endif

Board.h

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

#include "Move.h"
struct board {
    struct move m_move; /* one of the two can be a full definition */
};
#endif

main.c

代码语言:javascript
运行
复制
#include "Board.h"
int main() { ... }

注意:每当创建“委员会”时,您都需要这样做(有几种方法,下面是一个例子):

代码语言:javascript
运行
复制
struct board *b = malloc(sizeof(struct board));
b->m_move.m_board = b; /* make the move's board point 
                        * to the board it's associated with */
票数 14
EN

Stack Overflow用户

发布于 2010-01-11 21:50:50

包括警卫将是解决这一问题的一部分。

维基百科的例子:

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

struct foo {
    int member;
};

#endif

守卫

另一部分,正如其他几个人所指出的,是向前参照。(参考文献)

您可以部分地将其中一个结构声明在另一个之上,如下所示:

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

struct bar;
struct foo {
    int member;
};

#endif
票数 3
EN

Stack Overflow用户

发布于 2010-01-11 21:50:43

就像这样:

代码语言:javascript
运行
复制
//Board.h
#ifndef BOARD_H
#define BOARD_H
strunct move_t; //forward declaration
typedef struct move_t Move;
//...
#endif //BOARD_H

//Move.h
#ifndef MOVE_H
#define MOVE_H
#include "Move.h"
typedef struct board_t Board;
//...
#endif //MOVE_H

通过这种方式可以编译Board.h而不依赖于move.h,并且可以从move.h中包含board.h以使其内容在那里可用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2045159

复制
相关文章

相似问题

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