2016-03-25 77 views
0

我正在嘗試使用C中的一些基本數據結構。我在很長一段時間後回到了C語言。這裏是我的簡單structC中的未知類型名稱錯誤

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

但它給一個編譯錯誤,如上圖所示。是因爲編譯時struct編譯器不知道LLNode的存在嗎?這意味着我必須首先在struct之前聲明LLNode。是這樣嗎?如果是的話,我應該怎麼做?

回答

4

做到這一點的方法:

typedef struct LLNode LLNode; 

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

不能使用的定義之前LLNode類型。 使用此方法,您首先聲明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 LLNodeLLNode

2

typedef是不完整的,直到結束,所以LLNode不可用作爲struct內的類型名稱。然而,struct標籤會,所以你可以這樣做:

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

這將產生一個struct具有相同的結構,什麼是在您的文章,因爲struct LLNodetypedef -ed到LLNode

+0

如何比較在'struct'之前定義'typedef',如下面答案中的@jdarthenay解釋的那樣? – Mahesha999

+0

@ Mahesha999這是一個偏好問題。你的'struct'定義獨立於'typedef',你可以將它們合併或者按照你的意願將它們分開;只要它看到它們,對編譯器無關緊要。還有另一種可能性是首先定義沒有'typedef'的'struct',然後在末尾添加'typedef struct LLNode LLNode'。所有這三種情況的效果都是一樣的。 – dasblinkenlight

0

你可以使用:

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

嗨,你應該使用嵌入式代碼輸入器,就像你在其他答案中看到的那樣,而不是像上面那樣顯示它。 點擊「{}」按鈕即可將代碼放入。 –