2009-08-08 50 views
1

我有一個名爲cpu.h的文件,其中包含兩個名爲register.h和addrmode.h的其他頭文件。在cpu.h中定義了一個cpu_t結構體,這兩個結構體都需要它們的功能。我嘗試在其他兩個包含文件中包含cpu.h,但沒有包含任何內容。我猜測他們不包括在內,因爲在cpu.h中設置了包含警衛。有誰知道如何解決這個問題?Tricky包含C中的情況

回答

10

聲明cpu_t在其自己的頭文件中,其他三個包括,也許types.h

+0

由於一噸的人,雖然我應該想到這一點:) – 2009-08-08 19:30:45

+0

要補充的,把一個包括後衛在cpu_t的頭文件中,並且#include在你使用該結構的任何地方,這樣你就不會突然失去內部依賴關係,如果你刪除了其他頭文件之一。 – 2009-08-10 00:41:56

0

你可以在cpu.h中定義struct cpu_t,然後它包含其他兩個頭文件?

其實我更喜歡Oren Trutner的回答。我的答案更脆弱---你真的不想要相互遞歸的頭文件。

+0

我也同意,看起來像是對我的破解 – 2009-08-08 19:22:30

0

你已經說過「沒有包含任何東西」,但是這是基於其他一些觀察的推論。你看到什麼錯誤信息?我認爲我們需要更多信息。

+0

沒有錯誤消息,只是沒有任何定義可以從包含文件訪問的事實。這是因爲包括了警衛,而gcc確實不包括cpu.h. – 2009-08-08 19:28:28

3

循環包含可能會成爲代碼維護和調試的麻煩。我建議將cpu.h分成兩個文件:一個是register.h和addrmode.h,另一個是包含這兩個文件的文件。

1

要麼安排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; };

  • 您定義的內聯函數需要訪問成員或具有類型的局部變量

+0

如果您在需要register.h和addrmode.h的文件中使用內部結構的函數,您不必小心。如果你首先包含cpu.h,那麼'struct cpu;'破壞了先前的定義,在現在不完整的結構中沒有成員;如果你首先不包含cpu.h(除了可能是config.h之外的所有頭文件),那麼你並沒有表明cpu.h可以獨立運行,這會影響它的可用性(並且違反了明智的C編碼標準的頒佈由美國宇航局戈達德太空飛行中心)。 – 2009-08-08 19:52:48

+0

你從哪裏得到了struct cpu;會打破以前的定義?如果沒有定義的聲明是不可能的,你將如何定義相互遞歸類型。事實上,我受到C++實踐的影響,這是一個讀取struct cpu的行;單獨在C中是不需要的(在C++中,它與typedef struct cpu cpu具有相同的效果;因爲標記名稱是自動鍵入的名稱)。我會完成我的回答。 – AProgrammer 2009-08-09 06:27:47