Структуры, которые относятся друг к другу
Я хочу иметь две структуры, которые могут содержать друг друга. Вот пример:
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
и наоборот.