我有一個名爲cpu.h的文件,其中包含兩個名爲register.h和addrmode.h的其他頭文件。在cpu.h中定義了一個cpu_t結構體,這兩個結構體都需要它們的功能。我嘗試在其他兩個包含文件中包含cpu.h,但沒有包含任何內容。我猜測他們不包括在內,因爲在cpu.h中設置了包含警衛。有誰知道如何解決這個問題?Tricky包含C中的情況
回答
聲明cpu_t
在其自己的頭文件中,其他三個包括,也許types.h
?
你可以在cpu.h中定義struct cpu_t,然後它包含其他兩個頭文件?
其實我更喜歡Oren Trutner的回答。我的答案更脆弱---你真的不想要相互遞歸的頭文件。
我也同意,看起來像是對我的破解 – 2009-08-08 19:22:30
你已經說過「沒有包含任何東西」,但是這是基於其他一些觀察的推論。你看到什麼錯誤信息?我認爲我們需要更多信息。
沒有錯誤消息,只是沒有任何定義可以從包含文件訪問的事實。這是因爲包括了警衛,而gcc確實不包括cpu.h. – 2009-08-08 19:28:28
循環包含可能會成爲代碼維護和調試的麻煩。我建議將cpu.h分成兩個文件:一個是register.h和addrmode.h,另一個是包含這兩個文件的文件。
要麼安排register.h和addrmode.h,以便它們不需要結構的定義或將結構的聲明移動到它自己的頭部。
注意,你不需要CPU的定義:
定義結構CPU的類型定義:
typedef結構的CPU cpu_type的;
定義一個變量或指針類型的一個成員爲結構CPU:
結構CPU * PTR;
聲明類型結構的CPU的外部變量:
的extern結構CPY myCpu;
聲明函數採取一個結構參數的cpu:
無效美孚(結構CPU P);
所以主要的原因,需要一個結構的定義放在一個頭,其目的不是提供definitin是:
你在標題定義爲成員的結構類型struct cpu:
struct intelcpu {0} struct cpu base; };
您定義的內聯函數需要訪問成員或具有類型的局部變量
如果您在需要register.h和addrmode.h的文件中使用內部結構的函數,您不必小心。如果你首先包含cpu.h,那麼'struct cpu;'破壞了先前的定義,在現在不完整的結構中沒有成員;如果你首先不包含cpu.h(除了可能是config.h之外的所有頭文件),那麼你並沒有表明cpu.h可以獨立運行,這會影響它的可用性(並且違反了明智的C編碼標準的頒佈由美國宇航局戈達德太空飛行中心)。 – 2009-08-08 19:52:48
你從哪裏得到了struct cpu;會打破以前的定義?如果沒有定義的聲明是不可能的,你將如何定義相互遞歸類型。事實上,我受到C++實踐的影響,這是一個讀取struct cpu的行;單獨在C中是不需要的(在C++中,它與typedef struct cpu cpu具有相同的效果;因爲標記名稱是自動鍵入的名稱)。我會完成我的回答。 – AProgrammer 2009-08-09 06:27:47
- 1. 在C#中不包含System.Web.MVC的情況下添加SelectListItem()類
- 2. 使用情況幷包含在SQL中
- 3. math.h默認情況下包含在Objective-C中
- 4. 的jQuery 1.8包含情況insesitive +始於
- 5. 默認情況下WordPress的jquery包含
- 6. 如何在不包含MANIFEST.in文件的情況下包含package_data?
- 7. 使用XPath包含這種情況嗎?
- 8. 在C++中,如何讓類在不包含頭的情況下識別結構?
- 9. 如何在不崩潰的情況下將WebView包含在Objective C中
- 10. AngularJS - 如何在沒有包裝的情況下包含模板
- 11. C++中的有趣情況
- 12. 如何僅在未包含Javascript和css文件的情況下包含它們?
- 13. 默認情況下,.cu源文件中包含哪些標題?
- 14. 的SQL * Plus的情況下正確的程序路徑包含
- 15. 如何使用jQuery的.not和:包含多個值的情況?
- 16. C - Tricky Switch Case工作..!
- 17. Eclipse MARS包含路徑上的linux環境使用情況
- 18. 在不提交表單的情況下包含按鈕
- 19. JavaScript運行在默認情況下不包含的Gemfile
- 20. 續集包含多個條件的情況下
- 21. php memory_get_peak_usage()包含mysql的內存使用情況?
- 22. x86在不包含文件的情況下訪問標籤
- 23. 問題:您的應用包含非公開API使用情況?
- 24. CSS - 在包含div的情況下並排排列兩個Div
- 25. 如何在不污染代碼的情況下包含WinAPI?
- 26. 在不使用CMake的情況下包含一個庫
- 27. 如何在不必包含MicrosoftAjax.js的情況下使用MicrosoftMvcValidation.js?
- 28. Rails僅在包含參數的情況下呈現Json
- 29. 如何在不包含www的情況下跳轉到URL?
- 30. 在這種情況下擴展或包含正確的?
由於一噸的人,雖然我應該想到這一點:) – 2009-08-08 19:30:45
要補充的,把一個包括後衛在cpu_t的頭文件中,並且#include在你使用該結構的任何地方,這樣你就不會突然失去內部依賴關係,如果你刪除了其他頭文件之一。 – 2009-08-10 00:41:56