2016-03-25 125 views
0

私はCで基本的なデータ構造を試しています。私は長い時間の後にCに戻ってきます。Cで不明な型名エラー

typedef struct 
{ 
    int data; 
    LLNode *next; //Error: unknown type name 'LLNode' 
}LLNode; 

しかし、上記のように、コンパイルエラーを与える:ここに私の簡単なstructです。コンパイル中にstructコンパイラがLLNodeの存在を意識していないのでしょうか?つまり、私は最初にLLNodestructの前に宣言する必要があります。それはそれのようなものですか?はいの場合、どうすればいいのですか?

typedef struct LLNode LLNode; 

struct LLNode { 
    int data; 
    LLNode *next; //No error 
}; 

それが定義される前にあなたがLLNodeタイプを使用することはできません。

答えて

4

は、このような方法を実行してください。 このメソッドでは、まずLLNodeと宣言します。 struct LLNodeがまだ定義されていないにもかかわらず、この宣言では、LLNode *メンバーを宣言するだけで十分です(ただし、LLNodeメンバーは宣言できません)。ポインタのサイズはポインタの型に依存しないためです。

+0

。 – Cubic

+1

@Cubicあなたは正しいです。完了しました。 – jdarthenay

6

構造体のデータメンバnextは、タイプがLLNodeであり、未知であると宣言されています。

typedef struct LLNode 
{ 
    int data; 
    struct LLNode *next; //Error: unknown type name 'LLNode' 
}LLNode; 

修正の例では、構造体タグ名とのtypedef名が異なる名前空間にあることを考慮してください。だから、struct LLNodeとちょうどLLNodeのように、この2つの名前を同時に使うことができます。

2

typedefは最後まで不完全ですので、の中にはタイプ名としてLLNodeを使用できません。あなたがこれを行うことができますので、しかし、structタグは、利用できるようになります:struct LLNodeLLNodeに-ed typedefあるので

typedef struct LLNode 
{ 
    int data; 
    struct LLNode *next; 
} LLNode; 

これは、あなたのポストにあるものと同じ構造を持つstructを生成します。

+0

これは、以下の答えの@jdarthenayで説明されている 'struct'の前に' typedef'を定義する方法と比べてどうですか? – Mahesha999

+0

@ Mahesha999それは好みの問題です。あなたの 'struct'定義は' typedef'から独立しています。あなたはそれらを組み合わせることもできますし、望むようにそれらを分離することもできます。コンパイラには問題はありませんが、どちらのコンパイラにも当てはまります。さらにもう一つの可能​​性は 'typedef'を使わずに' struct'を定義し、最後に 'typedef struct LLNodeLLNode'を追加することです。その効果は、3つすべてのケースで同じになるでしょう。 – dasblinkenlight

0

あなたが使用することができます:あなたは完全酒のために、動作する理由の説明を追加したいかもしれません

typedef struct LLNode LLNode; 
struct LLNode 
{ 
int data; 
LLNode *next; 
}; 
+0

ちょっと上のように表示するのではなく、上に表示されているような埋め込みコード入力を使用してください。 「{}」ボタンをクリックして、そのようなコードを入力します。 –

関連する問題