2015-02-07 3 views
0

Я пытаюсь направить объявить STRUCT A и определение структуры B, который содержит массив А. Я получаю сообщение об ошибке с указанием «неполную типа не допускается»массива вперед объявил структуры в других структурах

Это что у меня есть:

struct A; 

struct B 
{ 
// something 
struct A x[10]; // This where I get the error incomplete type not allowed 
}; 

struct A 
{ 
// something 
}; 

Что я делаю неправильно?

ответ

2

В работе вокруг вас может объявить указатель на структуру А, как этого

struct B 
{ 
// something 
struct A * x; 
}; 

Это происходит потому, что если у вас есть строка, как

struct B b; 

b будет членом x[10]. Если вы не полностью объявили структуру A, struct B не знает, как выделить 10 элементов структуры A. В обходном пути, если вы только объявляете указатель, struct B не должен знать, как распределить struct A, но только нужно знать, как выделить один указатель.

1

«Неполный тип» (MSDN) - это тип, детали которого компилятор не знает в данной точке блока перевода. В объявлении членов struct B компилятор не знает размер шрифта (sizeof (struct A)) и поэтому не знает, сколько места у него осталось. Еще одна причина, по которой недопустимые struct члены неполного типа состоят в том, что если бы они могли, это позволило бы «круговой состав», где struct A содержит членов типа struct B и наоборот. Я не вижу, как можно определить размер результата такой круговой композиции.

Обходные:

  • Чтобы включить struct A по значению в struct B, завершивший типа первым. Переместите объявление членов struct A выше struct B.
  • A struct разрешено включать указатели к неполным типам в качестве членов. В struct B, включите массив указателей (struct A *x[10];) Затем заселите его объектами типа struct A, выделенными отдельно, возможно через какой-то завод, который вызывает malloc(sizeof(struct A)), заполняет его элементы и возвращает указатель. Затем вы ответственны за освобождение памяти, используемой этими экземплярами.
Смежные вопросы