Форвардное объявление структур typedef в GBDK C

Я использую GBDK C, чтобы создать игру для оригинального Game Boy, и столкнулся с небольшой проблемой. Каждая комната в моей игре должна иметь разные portalsно каждый portal должен ссылаться на комнату. Вот урезанная версия кода:

typedef struct {
    Portal portals[10];
} Room;

typedef struct {
    Room *destinationRoom;
} Portal;

Любые предложения о том, как этого добиться? Я попытался добавить предварительную декларацию struct Portal; в начало файла, но это не помогло.


Используя следующий код:

typedef struct Room Room;
typedef struct Portal Portal;

struct Room {
    Portal portals[10];
};

struct Portal {
    Room *destinationRoom;
};

Дает мне эту ошибку:

parse error: token -> 'Room' ; column 11
*** Error in `/opt/gbdk/bin/sdcc': munmap_chunk(): invalid pointer: 0xbfe3b651 ***

1 ответ

Решение

Изменить порядок определений и написать предварительную декларацию для Room а также Portal типы:

typedef struct Room Room;
typedef struct Portal Portal;

struct Portal {
    Room *destinationRoom;
};

struct Room {
    Portal portals[10];
};

Обратите внимание, что я отделил typedef Portal от фактического struct Portal определение последовательности, хотя это не является строго необходимым.

Также обратите внимание, что этот стиль совместим с C++, где typedef неявный, но может быть написан явно таким образом, или с помощью простого предварительного объявления, такого как struct Room;

Если по какой-либо причине вы не можете использовать тот же идентификатор для struct тег и typedef, вы должны объявить структуры следующим образом:

typedef struct Room_s Room;
typedef struct Portal_s Portal;

struct Portal_s {
    Room *destinationRoom;
};

struct Room_s {
    Portal portals[10];
};
Другие вопросы по тегам