结构问题,放置它们的位置以及如何在标题中引用它们?

时间:2010-07-01 02:41:47

标签: c struct header declaration

好吧,我现在处于两难境地,而且我对C(不是最大的那个)和全能的谷歌的了解似乎都无法帮助我:

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

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

现在的问题是:Map需要引用其上的Player,正在构建Player,为其提供MapCharaChara也需要Map

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

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

2 个答案:

答案 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)

确保你的引用是指针而不是对象的实际副本,你应该能够正确地声明它们。