6

「The C Programming Language」を読んでいて、 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は へのポインタのエイリアスであること」を伝え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型の既知のエイリアスであるためです。最後のセミコロンに到達するまで (大まかに言えば) is not a known alias をstruct tnode *使用するTreenode *left;ことはできません。Treenode

于 2012-11-09T06:41:47.437 に答える
1

を宣言するときTreePtr、構造体を実装していません。これは「前方宣言」として知られています。「ここではこれを使用しますが、後で詳しく説明します」のようなものです。実装は後で一度だけ表示する必要があり、それが 2 番目の にありtypedefます。

AndTreePtrは構造体と同じではありません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 に答える