Структуры, которые относятся друг к другу

Я хочу иметь две структуры, которые могут содержать друг друга. Вот пример:

struct a {
  struct b bb;
};

struct b {
  struct a aa;
};

Но этот код не компилируется. gcc говорит:

test.c:3: error: field ‘bb’ has incomplete type

Есть ли способ достичь этого?

Ответ 1

Как это должно работать? a будет содержать b, который будет содержать a, который будет содержать b и т.д.

Предположим, вы хотите вместо этого использовать указатель?

struct b;

struct a {
  struct b *bb;
};

struct b {
  struct a *aa;
};

Даже если это плохой стиль кодирования, следует избегать круговых зависимостей, если это возможно.

Ответ 2

struct a;
struct b;

struct a{
   struct b *bb;
};

struct b{
   struct a *aa;
};

Большая часть файла заголовка объявляет структуру перед определением ее членов. Определение структуры будет определено где-то еще.

Ответ 3

Обычный способ справиться с этим - сделать их указателями, а затем динамически распределить их или даже просто назначить указатель из адреса статического экземпляра другой структуры.

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;
}

Я бы предположил, однако, что вы ищете древовидную организацию. Возможно, оба объекта могут указывать на общий третий тип.

Ответ 4

Это бессмысленно.

Представьте, если вы скажете, что каждый X содержит Y, а каждый Y содержит X, то внутри каждого X есть Y, который, в свою очередь, содержит X, который в поворот содержит a Y, который, в свою очередь, содержит X, бесконечность.

Вместо этого вы можете иметь X содержать ссылку или (или указатель на) a Y и наоборот.