2015-10-10 3 views
4

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

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 *** 
+0

Обратите внимание, что ЬурейеЕ является абсолютно никакого отношения. –

ответ

5

Переупорядочьте определения и написать опережающее объявление для типов Room и Portal:

typedef struct Room Room; 
typedef struct Portal Portal; 

struct Portal { 
    Room *destinationRoom; 
}; 

struct Room { 
    Portal portals[10]; 
}; 

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

Также обратите внимание, что этот стиль совместим с C++, где ЬурейеЕ имплицитно, но может быть записана в явном виде этот путь, или с помощью простого прямого заявления, как 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]; 
}; 
+0

К сожалению, это не решило мою проблему (см. Правки) – bashaus

+1

@bashaus: Вы не изменили порядок определений. 'struct Portal' должен быть определен первым, поэтому его размер известен, когда вы определяете' struct Room'. – chqrlie

+0

GBDK C требует, чтобы у моей структуры и typedef тоже были разные имена, поэтому у моей 'struct RoomStruct' есть' typedef struct RoomStruct Room' – bashaus

Смежные вопросы