2016-08-21 51 views
1

比方說,我有一個名爲foo.h的頭文件,它包含另一個頭文件bar.hC++,我應該包括一些東西,如果我需要它*和*其他東西,它包括?

我也有一個名爲xyz.h的頭文件。它需要foo.hbar.h,雖然foo.hbar.h無關彼此,所以我會覺得怪異只是包括foo.h(仍然編譯,因爲它包括bar.h ...

所以,foo.h包括bar.hbar.h包括foo.h,但xyz.h包括foo.hbar.h。這是不好的做法?是否有任何理由爲什麼我不應該?爲什麼我能做到這一點?

+2

這是常見的做法。您並不總是知道標題包含的其他頭文件,因此您可以包含所有需要的頭文件。 [#include guards](https://en.wikipedia.org/wiki/Include_guard)可以防止問題,如果相同的標題包含兩次。 – Barmar

+3

每個頭文件都應該包含所有頭文件,它需要忽略它們是否可能通過另一個頭文件被順帶包含(因爲這可能會改變)。 – Galik

+0

通過搜索引擎查找「包含您使用的內容」。它應該提出http://include-what-you-use.org/和https://github.com/include-what-you-use/include-what-you-use和其他參考。 –

回答

2

每個頭應該是自包含的。它應該包括它需要的所有其他標題並且有include guards

假設標題不是自包含的。然後,如果你希望在不同的客戶端使用該頭文件,那麼新客戶端甚至不會編譯,除非你找到並且需要其他頭文件。

也有一些罕見的情況,頭文件不能自包含,例如,詳情請查看Google's code style

大多數編譯器支持包含依賴調查的選項。這些選項和其他工具在此question中討論。

+0

你在第一段中說的是真的 - 它通常被稱爲「自包含和冪等的」。然而,這個問題是在涉及多個頭時詢問「自成一體是什麼意思」。問題是一個頭A.h可以是自包含的,因爲它包含另一個頭B.h,它又包括C.h和C.h定義A.h使用的東西。雖然Bh仍然需要Ch,但是Ah是自足的,因爲它會起作用,但是如果Bh發生變化而不再需要Ch,但是Ah仍然需要Ch,那麼Ah不再是獨立的 - 因爲Bh已經改變了。 –

+0

@JonathanLeffler如果'A.h'使用'C.h'中定義的內容,而不是它應該包含'C.h'或者對已經使用的內容進行前向聲明。我理解它是「獨立的」標題。 – Nikita

+1

我明白了;我同意。但是,如何證明A.h不是完全獨立的,而B.h仍然包含C.h?請參閱[我應該在頭文件中使用'#include'](http://stackoverflow.com/questions/1804486)瞭解C程序員對事物的看法,以及一些確保自我控制的有效方法。但是'相當有效的方式'很容易受到上面提到的A.h,B.h,C.h的情況的影響 - 而且避免這種情況並不是一個簡單的方法。請參閱http://Include-What-You-Use.org/等 –

相關問題