我有一些游戏原型的结构:
Map
(嗯......地图..)Chara
(玩家敌人的基地)Player
(玩家)现在的问题是:Map
需要引用其上的Player
,正在构建Player
,为其提供Map
和Chara
,Chara
也需要Map
。
如果我在头文件中声明了结构并用#ifndef
包装它,那么当我在其他头文件中包含头文件时,我会遇到循环依赖循环。
当我在.c文件中声明结构时,我使用了extern struct Map map
等,但后来遇到invalid use of incomplete declaration
或forward declaration of struct XXX
等问题。
现在是凌晨4点,我想花更多的时间来重写引擎的东西(已经存在于Python和JavaScript中......是的,我有太多的时间!)而不是在剩下的时间内尝试搜索术语的每个可行组合。
我知道这可能是一个非常简单的事情,但它在这里有30°C,所以请怜悯我的C“技能”^^
修改
由于我的问题使用了typedefs和caf的答案并没有包含它们,我不得不用它来调整一下以使它全部正常工作。因此,为了帮助那些可能通过SE找到这个答案的人,我将添加以下代码:
map.h
typedef struct _Player Player;
typedef struct _Map {
...
Player *player;
...
} Map;
map.c
// include both player.h and chara.h
player.h
typedef struct _Map Map;
typedef struct _Chara Chara;
typedef struct _Player {
Chara *chara;
...
} Player;
Player *player_create(Map *map, int x, int y);
player.c
// include player.h, chara.h and map.h
答案 0 :(得分:3)
如果您的结构只包含指向其他结构的指针,则此方法有效:
<强> map.h 强>
#ifndef _MAP_H
#define _MAP_H
struct player;
struct map {
struct player *player;
...
};
#endif /* _MAP_H */
<强> chara.h 强>
#ifndef _CHARA_H
#define _CHARA_H
struct map;
struct chara {
struct map *map;
...
};
#endif /* _CHARA_H */
<强> player.h 强>
#ifndef _PLAYER_H
#define _PLAYER_H
struct map;
struct chara;
struct player {
struct map *map;
struct chara *chara;
...
};
#endif /* _PLAYER_H */
如果你的一个结构包含其他结构(包括数组)的实际实例,那么那个结构也需要#include
另一个结构。例如,如果map
包含一系列玩家:
<强> map.h 强>
#ifndef _MAP_H
#define _MAP_H
#include "player.h"
struct map {
struct player p[10];
...
};
#endif /* _MAP_H */
你必须要小心圆形包含。如果您在map.h
中添加了player.h
,那么您无法在player.h
之前将map.h
包含在其他源文件中 - 因此您不会这样做。
答案 1 :(得分:0)
确保你的引用是指针而不是对象的实际副本,你应该能够正确地声明它们。