struct typedef中的声明规则

我正在阅读’C编程语言’,并遇到了关于struct的 typedef的问题。 代码是这样的:

typedef struct tnode *Treeptr; typedef struct tnode { /* the tree node: */ char *word; /* points to the text */ int count; /* number of occurrences */ struct tnode *left; /* left child */ struct tnode *right; /* right child */ } Treenode; 

到我们写的时候

 typedef struct tnode *Treeptr; 

tnode仍未声明,但我们没有得到任何编译错误,但是当我们将上面的语句更改为:

 typedef Treenode *Treeptr; 

我们得到编译错误:

 error: parse error before '*' token warning: data definition has no type or storage class 

是什么导致了差异? “struct tnode”与“Treenode”不一样吗?

在定义之前不能使用类型。

使用typedef struct tnode { ... } Treenode; 声明, Treenode类型直到达到分号才定义。

typedef struct tnode *Treeptr; 是不同的。 这告诉编译器’有一个名为struct tnode的结构类型, struct tnode类型是指向struct tnode ‘的指针的别名。 在该声明的最后, struct tnode是一个不完整的类型。 您可以创建指向不完整类型的指针,但不能创建不完整类型的变量(因此您可以定义Treeptr ptr1;或者struct tnode *ptr2;它们是相同的类型,但您无法定义struct tnode node; )。

struct tnode的主体可以写成:

 typedef struct tnode { char *word; int count; Treeptr left; Treeptr right; } Treenode; 

因为在定义结构之前, Treeptrstruct tnode *类型的已知别名。 你不能使用Treenode *left; 因为Treenode不是已知的别名,直到达到最终的分号(粗略地说)。

声明TreePtr ,您没有实现该结构。 这被称为“ 前瞻性宣言 ”。 类似的东西:“我们在这里使用它,但后来我会更好地解释它”。 实现必须稍后出现,只能出现一次,这就是您在第二个typedef找到的内容。

TreePtr与struct不同,因为TreePtr实际上是一个包含指针的新类型。

一行line typedef struct tnode *Treeptr; 具有“tnode”结构的隐式前向声明。 它类似于:

 typedef struct tnode Treenode; typedef Treenode *Treeptr; struct tnode { /* the tree node: */ char *word; /* points to the text */ int count; /* number of occurrences */ struct tnode *left; /* left child */ struct tnode *right; /* right child */ };