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

array of forward declared struct in another struct

我正在尝试转发声明一个结构 A 并定义一个包含 A 数组的结构 B。 我收到错误说明 'incomplete type not allowed'

这是我的:

struct A;

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

struct A
{
// something
};

我做错了什么?

作为解决方法,您可以将指向结构 A 的指针声明为这样

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

这是因为如果你有这样一行

struct B b;

b 将有一个成员 x[10]。如果你没有完全声明 struct A,struct B 就不知道如何分配 10 个 struct A 元素。在解决方法中,如果您只声明一个指针,则结构 B 不需要知道如何分配结构 A 而只需要知道如何分配一个指针。

"incomplete type" (MSDN) 是一种类型,编译器在翻译单元的给定点不知道其详细信息。在 struct B 的成员声明中,编译器不知道类型的大小 (sizeof (struct A)),因此不知道要为它保留多少 space。不允许 struct 不完整类型成员的另一个原因是,如果可以的话,这将允许 "circular composition" 其中 struct A 包含类型 struct B 的成员,反之亦然。我什至不知道如何定义这种圆形合成结果的大小。

解决方法:

  • 要在 struct B 中按值包含 struct A,请先完成类型。将 struct A 的成员声明移到 struct B.
  • 的上方
  • A struct 允许包含指向不完整类型的指针作为成员。在 struct B 中包含一个指针数组 (struct A *x[10];) 然后用单独分配的 struct A 类型的对象填充它,可能通过一些调用 malloc(sizeof(struct A)) 的工厂来填充它的成员, 和 returns 指针。然后您负责释放这些实例使用的内存。