2010-07-01 44 views
3

好的,我现在处于困境中,而且我对C(它不是最大的那个)的知识,也不是全能的Google似乎能够帮助我:结构问题,在哪里放置它们以及如何在标题中引用它们?

我有一些结构的游戏原型:

  • Map(Uhhm ...地图..)
  • Chara(对敌人基地的玩家)
  • Player(玩家)

现在的问题是:Map需要的Player这是它的参考,Player正在建设中赋予它MapChara,并Chara需要Map了。

如果我在头文件中声明结构并用#ifndef打包它们,当我从其他头文件中包含头文件时,我会遇到循环依赖性循环。

当我在.c文件中声明结构时,我使用了extern struct Map map等,但后来遇到类似invalid use of incomplete declarationforward 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 
+0

只要使用字符。 Chara必须是我整天看到的最烦人的事情。 – 2010-07-01 03:50:46

+0

侧面错误:不要使用以_开头的名字作为结构。根据后面字符的大小写以及是否只有一个或两个下划线,它们可以保留用于C/OS实现。与其试图记住哪些是你被允许使用以及哪些不是你最好避免以_开头的名字完全。多个包容卫士也是如此。使用'#ifndef PLAYER_H'而不是'#ifndef _PLAYER_H'。标准C头文件使用_的原因是因为它们是编译器/操作系统的一部分,并试图避免与为您保留的名称冲突。 – 2010-07-02 11:43:07

回答

3

这个作品,如果你只结构包含指向其他结构:

地图。ħ

#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 - 因此您不会那样做。

+0

感谢您的例子!第一个终于把我带到了正确的轨道上,一切都很好,并且现在变得很华丽:) – 2010-07-01 03:28:21

+0

根据这个问题,地图需要一个指针/参考给玩家。第二种方法在这种情况下变得更加复杂,我认为需要一个前向引用。 – sje397 2010-07-01 04:06:06

+0

事实上,你的第二种方法已被破坏。当玩家包括地图时,_PAYER_H被定义 - 这意味着当地图包含玩家时,什么都不会发生。任何参考或指向地图中玩家的指针都会产生错误。 – sje397 2010-07-01 04:54:09

0

确保您的引用指针,而不是对象的实际副本,你应该能够前瞻性声明它们就好了。

相关问题