如果你不给结构一个标签名称,
struct node* left;
在结构定义中声明了一个新的(不完整的)类型struct node
。因此,当您传递一个指向该(不完整)类型node*
的指针时,您需要传递一个不兼容类型的指针。
当您定义的结构具有指向同一类型的指针时,您必须能够在定义中命名该类型,因此该类型必须在范围内。
如果您给struct
a 名称,则类型 - 从那时起 - 在范围内并且可以被引用,尽管尚未完成,如struct node
(如果标签是node
)。在 typedef 完成后,该类型可以被称为struct node
or 或node
,无论您喜欢哪个。
但是如果你不给struct
a 标签,那么在 typedef 完成之前类型是匿名的,并且在此之前不能以任何方式被引用。而自从当线
struct node *left;
遇到,不知道struct node
引用的类型,该行声明了一个新类型,struct node
,其中一无所知。编译器没有理由将该类型与当前定义的类型联系起来。因此,此时,struct
包含一个成员,该成员是指向未知不完整类型的指针。现在,在inorderTraversal
,当你打电话
inorderTraversal(p->left);
with node *p
,根据 的定义node
,p->left
是一个指向未知不完整类型的指针struct node
。如果p
已创建它p->left
实际上是一个指向 的指针node
,那么事情仍然会起作用(可能在指向不同类型的指针具有不同表示形式的平台上除外),但是您将指针传递给一种类型的指针,而该类型的指针需要指向不同类型的指针. 由于一种类型不完整,因此与预期类型不兼容。