另一个结构中的前向声明结构数组

时间:2015-02-07 01:31:42

标签: c struct forward-declaration

我试图转发声明一个结构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
};

我做错了什么?

2 个答案:

答案 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))的某个工厂填充其成员,并返回指针。然后,您负责释放这些实例使用的内存。