Поле C имеет неполный тип

У меня есть следующий заголовочный файл:

 #ifndef SERVER_STRUCTURES_H
 #define SERVER_STRUCTURES_H

typedef struct game {
  int id;
  struct player player1;
  struct player player2;
  struct game *next;
} game_t;

typedef struct player {
  int id;
  int score;
  struct player *player1;
  struct game *g ;
} player_t;

#endif

Я получаю сообщение об ошибке: поле "player1" имеет неполную структуру типа player player1

и

Поле player2 имеет неполную структуру типа player player2.

В чем ошибка? спасибо!


person irinao    schedule 10.11.2019    source источник
comment
Возможный дубликат структур, ссылающихся друг на друга   -  person MrTux    schedule 10.11.2019
comment
struct player — это неполный тип с самого начала до закрывающей скобки его определения. Вы не можете объявить переменную или поле структуры неполного типа. Это ошибка.   -  person n. 1.8e9-where's-my-share m.    schedule 10.11.2019
comment
Выберите свой учебник и найдите термин forward Declaration. И подумайте о порядке, в котором вы определяете вещи.   -  person Some programmer dude    schedule 10.11.2019


Ответы (1)


Объявления должны быть перед тем, где они используются, поэтому два объявления следует поменять местами. Чтобы выделить player1 и player2, компилятору потребуется полное объявление struct player.

Затем вы должны сообщить компилятору, что struct game будет объявлено позже. Информации достаточно, чтобы создать "указатель на что-то".

#ifndef SERVER_STRUCTURES_H
#define SERVER_STRUCTURES_H

struct game;

typedef struct player {
  int id;
  int score;
  struct player *player1;
  struct game *g ;
} player_t;

typedef struct game {
  int id;
  struct player player1;
  struct player player2;
  struct game *next;
} game_t;

#endif
person MikeCAT    schedule 10.11.2019