Во-первых, вам, кажется, не хватает включения охранников в ваши .h
файлы, поэтому вы включаете их рекурсивно. Это плохо.
Во-вторых, вы можете сделать предварительную декларацию. В Move.h
:
/* Include guard to make sure your header files are idempotent */
#ifndef H_MOVE_
#define H_MOVE_
#include "Board.h"
/* Now you can use struct Board */
struct Move { struct Board *board; };
#endif
In Board.h
:
#ifndef H_BOARD_
#define H_BOARD_
struct Move; /* Forward declaration. YOu can use a pointer to
struct Move from now on, but the type itself is incomplete,
so you can't declare an object of the type itself. */
struct Board { struct Move *move; }; /* OK: since move is a pointer */
#endif
Обратите внимание, что если вам нужно объявить объекты struct Move
и struct Board
(а не указатель на один из них) в обоих файлах, этот метод не будет работать. Это связано с тем, что один из типов является неполным типом во время анализа одного из файлов (struct Move
в приведенном выше примере).
Итак, если вам нужно использовать типы в обоих файлах, вам придется выделить определения типов: иметь заголовочные файлы, которые определяют struct Move
и struct Board
, и ничего больше (что-то вроде моего примера выше) , а затем используйте другой заголовочный файл, который ссылается на struct Move
и struct Board
.
Конечно, вы не можете struct Move
содержать struct Board
и struct Board
одновременно содержать struct Move
- это будет бесконечная рекурсия, а размеры структур также будут бесконечными!