2015-02-07 141 views
1

我在C中很生疏,但我認爲我有問題,理解在頭文件中使用typedef的正確用法,在實現文件中定義實際結構的結構,然後在第三個文件中使用該結構。typedef結構頭和解除引用指針不完整類型

我寫了一個隊列中的數據結構,它具有被定義爲這樣的類型:

typedef struct queue 
{ 
    int count; 
    qnode_t *head; 
    qnode_t *tail; 
} queue_t; 

哪裏qnode_t是唯一隊列的實現文件中使用的結構。

在我的頭我有這樣的:

typedef struct queue queue_t; 

另一個文件時我正在試圖獲得隊列的長度這樣內使用這種queue_t類型:

queue_t *work_queue; 
... 
int length = work_queue->count; 

然而,在該行在哪裏我仰望數我得到編譯器錯誤:

dereferencing pointer to incomplete type

我已經一直在做很多關於如何在C中正確定義類型的研究,但我認爲我只是越來越困惑自己,而不是變得清晰起來,因爲許多示例與其他資源相沖突,或者對於我來說實在太簡單了。

我會得到這個錯誤,因爲結構中的'count'變量沒有在那裏定義?如果是這種情況,那麼我可以在實現和頭文件中定義結構嗎?如果是這樣,頭部只能有定義的計數變量,因爲頭部尾部應該隱藏/隱藏? (我想念OOP)我應該只是做另一個功能,需要queue_t*並返回其長度爲size_t

+1

如果您搜索錯誤消息,你會發現很多以前的問題。這可能是由於一些錯誤造成的,目前還不清楚你製作了哪一個。嘗試閱讀這些問題,我敢打賭你找到一個解決你的錯誤。 – Barmar 2015-02-07 02:22:34

+0

@Barmar我通過其中的一些閱讀,但我有一堆後續/進一步的問題,這就是爲什麼我張貼自己的,因爲不幸的是,我還沒有確切地知道我做錯了什麼。 – JNYRanger 2015-02-07 02:25:28

回答

1

你只能取消引用定義的類型,而不是聲明類型。 類型聲明對類型檢查不透明指針很有用,但 對象字段不可見,無法訪問。您需要將typedef移動到標頭 以訪問您的隊列對象的字段。

編輯:從提問/回答以下問題:

是,兩個相同結構的定義被視爲相同的typedef。如果你從來沒有在同一個源文件中定義兩個定義,那麼你可以省略字段,但不要這樣做,這會導致錯誤和維護混淆。更好地使用命名約定,例如以下劃線開頭的名字是內部的。

約定是在頭文件中定義結構,然後在實現文件中包含相同的頭文件。這使得發佈的佈局與實現同步

+0

我有這樣的感覺,但後來我有一些後續事項(如我原來的問題):「那麼我可以在實現和頭中定義結構?如果是這樣,頭只能有自從頭部和尾部應該被隱藏/隱藏後定義的計數變量?「 – JNYRanger 2015-02-07 02:27:10

+0

是的,兩個相同的結構體定義被視爲相同的typedef。如果你從來沒有在同一個源文件中定義兩個定義,那麼你可以忽略字段,但是不要這樣做,這會導致錯誤和維護混淆。更好地使用命名約定,例如以下劃線開頭的名字是內部的。 – Andras 2015-02-07 02:33:24

+0

約定是在頭文件中定義結構,然後在實現文件中包含相同的頭文件。這將使發佈的佈局與實現保持同步。 – Andras 2015-02-07 02:35:46

0

除非編譯器有權訪問關於所指向的類型的完整信息,否則C中不可能解引用任何指針。對於結構指針,這意味着需要一個完整的結構定義。

因此,編譯抱怨不完整類型的代碼時,編譯器需要具有結構類型完整定義的可見性,而不僅僅是指針的typedef。

相關問題