在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?
0
A
回答
2
正如我所提到的一個comment:
用於ADT的結構定義通常應在源(.c
)文件定義了支持功能,只有類型的聲明應該在頭存在( .h
)文件。
但是,這意味着您不能在定義ADT的源文件之外分配結構的實例。您只能在外面定義指向ADT的指針。
如果您必須將定義從源代碼移動到頭文件,那意味着某些東西沒有使用應該使用指針的指針。返回並修復損壞的代碼,然後將結構定義移回到ADT的源文件中。
而且,確認在comment中記錄了什麼Nevado,這也意味着您不能擁有ADT數組;你可以有指向ADT的指針數組,但不是ADT本身的數組。
請注意,如果這是您希望或需要做的事情,那麼公開結構是完全合法的。然後,您可以創建數據類型或其數組的變量,或者在其他結構中嵌入類型(而不是指向該類型的指針)等。編寫使用結構的代碼的程序員可以看到細節,並可以直接訪問(讀取或修改)結構元素。謹慎的程序員不會做這些不必要的事情,但它會帶來嚴格的ADT習慣用法排除的可能性 - 冒犯錯誤的風險。
相關問題
- 1. 應該在哪裏聲明類對象?
- 2. 在C中聲明一個指針時,你應該在哪裏放置這個*?
- 3. 我應該在哪裏返回聲明
- 4. ASP.NET/C#我應該在哪裏使用屬性聲明會話?
- 5. 我應該在哪裏應該把C#DLL在Metro Style Appc中#
- 6. 應該在哪裏定義枚舉?
- 7. 應該在哪裏「包含」放在C++
- 8. 應該在哪裏聲明一個常量?
- 9. .cpp vs .h和我應該在哪裏放置函數定義
- 10. 聲明struct vop_vector在哪裏?
- 11. SQL:應該在哪裏定義主鍵
- 12. 我應該在哪裏定義枚舉?
- 13. 我應該在哪裏聲明Sugarcrm中的全局變量
- 14. C++/Qt編碼風格 - 在哪裏應該定義去
- 15. 我應該在哪裏應該聲明HTML幫助器在ASP.NET MVC 3
- 16. 在C++中聲明一個struct方法
- 17. 我應該在哪裏爲routes.rb定義一個約束?
- 18. 我應該在哪裏聲明該代碼中的字段才能編譯?
- 19. 如何確定一個浮球應該在哪個艙中? C++
- 20. 我應該在哪裏聲明數據庫對象
- 21. 在* .h中聲明的未定義引用已在另一個* .h中聲明
- 22. 我應該在哪裏聲明不同佈局的按鈕?
- 23. 我應該在哪裏聲明我的修改標識符?
- 24. ASP.net MVC:我應該在哪裏創建/聲明實體鍵?
- 25. beans.xml應該放在哪裏?
- 26. startup.m應該在哪裏?
- 27. 應該在哪裏支持函數聲明?
- 28. 如果庫使用它們,應該在哪裏聲明庫#defines?
- 29. 我應該在哪裏創建pthread
- 30. 我應該在哪裏存儲C#應用程序的數據?
你的問題到底是什麼?如果結構定義需要來自多個.c文件,那麼它應該放在標題中,否則不需要。 –
@ M.M它只在一個.c文件中需要。我的問題是,如果有一種選擇被認爲是一種好的做法而不是另一種,並且如果是這樣的話。 – Nevado
這是一個真正意義上的問題。一般來說,如果不需要在其他地方使用某個標頭,最好不要在標頭中放入某些東西 –