Estructuras que se refieren entre sí.

Quiero tener dos estructuras que pueden contener entre sí. Aquí hay un ejemplo:

struct a { struct b bb; }; struct b { struct a aa; }; 

Pero este código no comstack. gcc dice:

 test.c:3: error: field 'bb' has incomplete type 

¿Hay una manera de lograr esto?

¿Cómo se supone que funciona? a contendría b , que contendría a , que contendría b , etc …

Supongo que quieres usar un puntero en su lugar?

 struct b; struct a { struct b *bb; }; struct b { struct a *aa; }; 

Incluso si bien es un estilo de encoding incorrecto, las dependencias circulares deben evitarse si es posible.

 struct a; struct b; struct a{ struct b *bb; }; struct b{ struct a *aa; }; 

La mayoría del archivo de encabezado declara la estructura antes de definir sus miembros. La definición de la estructura se definirá en otro lugar.

La forma habitual de lidiar con esto es convertirlos en punteros y luego asignarlos dinámicamente o simplemente asignar el puntero desde la dirección de una instancia estática de la otra estructura.

 struct a { struct b *bb; }; struct b { struct a *aa; }; struct a a0; struct b b0; void f(void) { a0.bb = &b0; b0.aa = &a0; } 

Sin embargo, sugeriría que busque una organización con estructura de árbol. Quizás ambos objetos podrían apuntar a un tercer tipo común.

Esto es absurdo.

Imagínese si dice que cada X contiene una Y y cada Y contiene una X , entonces dentro de cada X hay una Y que a su vez contiene una X , que a su vez contiene una Y , que a su vez contiene una X , hasta el infinito .

En su lugar, puede hacer que una X contenga una referencia a o (o un puntero a ) una Y y viceversa.