簡體   English   中英

struct typedef中的聲明規則

[英]Declaration rule in 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 ,類型Treeptr為指針的別名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 */
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM