2017-12-03 181 views
0

在C中實現ADT時,我總是認爲struct的定義應該在.c文件中,以便它是私有的。並且typedef應放置在.h文件中,以便其他模塊可以使用ADT,但無法直接修改其屬性。 我最近遇到了一個問題,我不得不將結構移動到.h。我還找到了一個答案Error: In C, got the error "dereferencing pointer to incomplete type" in a struct pointer,據說struct應該在.c文件中定義。這是真的?如果是這樣,原因是什麼?應該在C中聲明一個struct的定義應該在哪裏? .c或.h?

+2

你的問題到底是什麼?如果結構定義需要來自多個.c文件,那麼它應該放在標題中,否則不需要。 –

+0

@ M.M它只在一個.c文件中需要。我的問題是,如果有一種選擇被認爲是一種好的做法而不是另一種,並且如果是這樣的話。 – Nevado

+0

這是一個真正意義上的問題。一般來說,如果不需要在其他地方使用某個標頭,最好不要在標頭中放入某些東西 –

回答

2

正如我所提到的一個comment

用於ADT的結構定義通常應在源(.c)文件定義了支持功能,只有類型的聲明應該在頭存在( .h)文件。

但是,這意味着您不能在定義ADT的源文件之外分配結構的實例。您只能在外面定義指向ADT的指針。

如果您必須將定義從源代碼移動到頭文件,那意味着某些東西沒有使用應該使用指針的指針。返回並修復損壞的代碼,然後將結構定義移回到ADT的源文件中。

而且,確認在comment中記錄了什麼Nevado,這也意味着您不能擁有ADT數組;你可以有指向ADT的指針數組,但不是ADT本身的數組。

請注意,如果這是您希望或需要做的事情,那麼公開結構是完全合法的。然後,您可以創建數據類型或其數組的變量,或者在其他結構中嵌入類型(而不是指向該類型的指針)等。編寫使用結構的代碼的程序員可以看到細節,並可以直接訪問(讀取或修改)結構元素。謹慎的程序員不會做這些不必要的事情,但它會帶來嚴格的ADT習慣用法排除的可能性 - 冒犯錯誤的風險。

相關問題