En primer lugar, parece que no tiene include guards en sus archivos .h
, por lo que los está incluyendo recursivamente. Eso es malo.
En segundo lugar, puede hacer una declaración directa. En 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
en 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
Tenga en cuenta que si tiene que declarar struct Move
y struct Board
objetos (en lugar de puntero a uno de ellos), tanto en los archivos, este método no lo hará trabajo. Esto se debe a que uno de los tipos es tipo incompleto en el momento del análisis de uno de los archivos (struct Move
en el ejemplo anterior).
lo tanto, si necesita utilizar los tipos, tanto en los archivos, tendrá que separar las definiciones de tipos: archivos han encabezado que definen struct Move
y struct Board
, y nada más (algo así como el ejemplo anterior), y luego use otro archivo de encabezado que haga referencia tanto a struct Move
como a struct Board
.
Por supuesto, no se puede tener struct Move
contienen una struct Board
struct Board
y contienen una struct Move
al mismo tiempo — que será recursividad infinita, y los tamaños struct será infinito, así!
Tenga en cuenta que en un mundo ideal, se evitan dependencias circulares como esta. Ciertamente no siempre es posible, y algunas veces pueden ser muy útiles, pero cada vez que creas una dependencia circular debes tomarte un momento para pensar en ello y justificar su existencia. –
@Greg D - Lo asesoré y creé otro archivo llamado Types.h donde hago todo mi #definación y definición de tipos. Incluyo eso en ambos archivos, ¡y todo está bien! – twolfe18