我试图转发声明一个结构A并定义一个包含A数组的结构B. 我收到错误声明'不允许不完整的类型'
这就是我所拥有的:
struct A;
struct B
{
// something
struct A x[10]; // This where I get the error incomplete type not allowed
};
struct A
{
// something
};
我做错了什么?
答案 0 :(得分:2)
作为一种解决方法,你可以声明一个指向struct A的指针
struct B
{
// something
struct A * x;
};
这是因为如果您有像
这样的行struct B b;
b
将有一名成员x[10]
。如果你没有完全声明struct A,那么struct B不知道如何分配10个struct A元素。在变通方法中,如果只声明指针,struct B不需要知道如何分配struct A,但只需要知道如何分配一个指针。
答案 1 :(得分:1)
“不完整类型”(MSDN)是编译器在翻译单元中的给定点不知道的类型。在struct B
成员的声明中,编译器不知道类型的大小(sizeof (struct A)
),因此不知道要为它留出多少空间。不允许struct
不完整类型成员的另一个原因是,如果可以的话,这将允许“循环组合”,struct A
包含struct B
类型的成员,反之亦然。我不知道如何定义这种圆形构图的结果大小。
解决方法:
struct A
中按值struct B
添加,请先填写类型。将struct A
的成员声明移到struct B
。struct
包含指向不完整类型的指针作为成员。在struct B
中,包含一个指针数组(struct A *x[10];
)然后用单独分配的struct A
类型的对象填充它,可能通过调用malloc(sizeof(struct A))
的某个工厂填充其成员,并返回指针。然后,您负责释放这些实例使用的内存。