Я знаю, что этот пост старый, но чтобы получить эффект, который вы ищете, вы можете попробовать следующее:
#define TAKE_ADVANTAGE
/* Forward declaration of "struct Cell" as type Cell. */
typedef struct Cell Cell;
#ifdef TAKE_ADVANTAGE
/*
Define Cell structure taking advantage of forward declaration.
*/
struct Cell
{
int isParent;
Cell *child;
};
#else
/*
Or...you could define it as other posters have mentioned without taking
advantage of the forward declaration.
*/
struct Cell
{
int isParent;
struct Cell *child;
};
#endif
/*
Some code here...
*/
/* Use the Cell type. */
Cell newCell;
В любом из двух случаев, упомянутых во фрагменте кода выше, вы ДОЛЖНЫ объявить свою дочернюю структуру Cell как указатель. Если вы этого не сделаете, вы получите сообщение об ошибке «поле 'child' имеет неполный тип" ». Причина в том, что "struct Cell" должна быть определена для того, чтобы компилятор знал, сколько места выделяется при его использовании.
Если вы попытаетесь использовать "struct Cell" внутри определения "struct Cell", то компилятор еще не может знать, сколько места должно занимать "struct Cell". Однако компилятор уже знает, сколько места занимает указатель, и (с предварительным объявлением) он знает, что «Cell» является типом «struct Cell» (хотя он еще не знает, насколько велик «struct Cell»). ). Таким образом, компилятор может определить «Cell *» в структуре, которая определяется.