Хорошо, сейчас у меня дилемма, и ни мое знание C (которое в любом случае не является самым большим), ни всемогущий Google, похоже, не могут мне в этом помочь:
У меня есть несколько структур для прототипа игры:
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
#ifndef PLAYER_H
, а не#ifndef _PLAYER_H
. Причина, по которой стандартные заголовки C используют _, заключается в том, что они являются частью компилятора / ОС и пытаются избежать конфликтов с именами, зарезервированными для вас. - person R.. GitHub STOP HELPING ICE   schedule 02.07.2010