6

我正在阅读“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”不一样吗?

4

3 回答 3

6

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

使用typedef struct tnode { ... } Treenode;声明,在Treenode到达分号之前不会定义类型。

情况typedef struct tnode *Treeptr;不同。这告诉编译器'有一个名为 的结构类型struct tnode,并且该类型Treeptr是指向 a 的指针的别名struct tnode。在该声明的末尾,struct tnode是一个不完整的类型。您可以创建指向不完整类型的指针,但不能创建不完整类型的变量(因此您可以定义Treeptr ptr1;orstruct tnode *ptr2;并且它们是相同类型,但您不能定义struct tnode node;)。

的主体struct tnode可以写成:

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

因为是定义结构之前Treeptr类型的已知别名。在到达最后一个分号(粗略地说)之前,struct tnode *您不能使用Treenode *left;因为不是已知的别名。Treenode

于 2012-11-09T06:41:47.437 回答
1

当您声明时TreePtr,您没有实现该结构。这被称为“前向声明”。类似于:“我们在这里使用它,但稍后我会更好地解释它”。该实现必须稍后出现,仅出现一次,这就是您在第二个中找到的内容typedef

并且TreePtr与结构不同,因为TreePtr实际上将是一种新类型,包括作为指针的事实。

于 2012-11-09T06:41:08.240 回答
0

一行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 */
};
于 2012-11-09T06:40:46.887 回答