结构问题,在哪里放置它们以及如何在标题中引用它们?
好的,我现在处于困境中,而且我对C(它不是最大的那个)的知识,也不是全能的Google似乎能够帮助我:结构问题,在哪里放置它们以及如何在标题中引用它们?
我有一些结构的游戏原型:
-
Map
(Uhhm ...地图..) -
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“技能” ^^
编辑
因为我的问题使用typedefs和咖啡的答案没有包括他们,我不得不摆弄更多的它,以使其工作。因此,为了帮助其可能通过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
这个作品,如果你只结构包含指向其他结构:
地图。ħ
#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 */
你必须要小心圆形包括但。如果您在player.h
中包含map.h
,那么在map.h
之前,您不能在其他源文件中包含player.h
- 因此您不会那样做。
确保您的引用指针,而不是对象的实际副本,你应该能够前瞻性声明它们就好了。
只要使用字符。 Chara必须是我整天看到的最烦人的事情。 – 2010-07-01 03:50:46
侧面错误:不要使用以_开头的名字作为结构。根据后面字符的大小写以及是否只有一个或两个下划线,它们可以保留用于C/OS实现。与其试图记住哪些是你被允许使用以及哪些不是你最好避免以_开头的名字完全。多个包容卫士也是如此。使用'#ifndef PLAYER_H'而不是'#ifndef _PLAYER_H'。标准C头文件使用_的原因是因为它们是编译器/操作系统的一部分,并试图避免与为您保留的名称冲突。 – 2010-07-02 11:43:07