2008-11-07 173 views
1

如何避免C中的包含循環?即。你不應該有a.h #include「b.h」,其中#include的「c.h」是哪個#include的「a.h」。我正在尋找一種方法來防止這種情況發生,使用某種C指令。C頭文件中的包含循環

我原本以爲這會已經阻止發生這樣的:啊

內容:BH的

#ifndef __A_H 
#define __A_H 

#include "b.h" 

#endif // __A_H 

內容:

#ifndef __B_H 
#define __B_H 

#include "c.h" 

#endif // __B_H 

章的內容:

#ifndef __C_H 
#define __C_H 

#include "a.h" 

#endif // __C_H 

但它似乎沒有工作。

+0

嘗試後,我想我找到了問題,它與包含循環無關。我在一個引起我的問​​題的頭文件中包含了一個枚舉。謝謝! – MSumulong 2008-11-07 23:43:33

+0

枚舉可以放置在標題中 - 如果標題服務的使用者需要它們。 – 2008-11-08 01:21:22

回答

7

它不好吧工作:將文件反覆包括在內,但通過#ifdndef /#保護的節定義/#ENDIF 重複,並且打破的惡性循環。

用你的編譯器產生預處理輸出,看看它自己。隨着GNU CC,你需要使用的.C [PP]文件「-E」選項,如:

gcc -E $(CFLAGS) -o foo.i foo.cpp 
+0

我相信你是對的。我認爲我的問題與在頭文件中定義的枚舉有關。 – MSumulong 2008-11-07 23:39:56

1

宏與領先的下劃線被保留用於預處理器/編譯器。

嘗試改變__ * _^h的東西更多的標準。
我使用HAVE __ * _ H。

1

這應該工作。它在你的例子中正確寫入,併爲我編譯好。你是否在你的實際代碼中輸入了錯誤的內容,或者你確實遇到了其他一些問題?

做爲所保留的編譯器和/或系統庫,您不應該開始的事情了與__,不過,。爲你的衛兵嘗試一些其他的名字。

0

This Works。

只是可以肯定的是,我居然編了test.c的,包括A.H與3個文件。

我驗證了這個工程的MSVC,數字火星和GCC的多個版本。

1

ya除了上述的東西,如果你正在使用turbo c,並且你正在使用這些源文件做一個項目,那麼就不會附加在源文件中包含的頭文件。並且即使它是不工作,然後從命令提示符嘗試它,因爲一些編譯器選項一次又一次地給這些錯誤。因此,如果頭文件內容在#ifndef和#endif之間,那麼即使包含這兩個文件也沒有問題。所以嘗試從項目中刪除頭文件保持在同一目錄中.bcos你沒有指定環境,我指定渦輪C,因爲我遇到過這種情況一次在渦輪C與頭文件#included在源文件中並附加到項目文件列表這時會出現「多申報問題」。還有編譯(即使有錯誤)到外部命令行,轉至目錄文件的存儲位置,並與文件名.exe directly.ok