這不一定是多餘的。事實上,你有獨立的頭文件和源文件意味着只要源文件爲頭文件提供定義,就可以交換src和頭文件。
.h文件應該只包含標題中使用的內容。例如,如果標題中沒有io聲明,則不需要stdio,而應該僅在src文件中使用,例如,如果它使用printf。
但是可能會出現這樣的情況,您可以使用一個標頭需要特定的包含,而另一個標頭不會(例如,當一個標頭比另一個標頭更具限制性時),在這種情況下,最好重複.h包括。
由於它被守護,所以它對你生成的最終對象/ exe沒有任何影響,並且它不會增加編譯時間,因爲它包含了一些值得擔心的事情,所以最好包含它們以防萬一你想使用不同的.h文件在某些時候。
編輯:更具體的例子 inc1.h
#ifndef INC1_H
#define INC1_H
inc1_struct {
int x;
};
#endif
inc2.h
#ifndef INC2_H
#define INC2_H
#include "inc1.h"
void inc2_f();
struct inc1_struct *inc2_callinc1();
#endif
prog.cpp 的#include 「inc1.h」 的#include 「inc2.h」
#include #include
void inc2_f() {
printf("inc2_f\n");
}
struct inc1_struct *inc2_callinc1() {
return (struct inc1_struct*) malloc(sizeof(struct inc1_struct));
}
int main(int argc, char **argv) {
struct inc1_struct *s = inc2_callinc1();
return 0;
}
這將編譯,但可以說你不想暴露
struct inc1_struct *inc2_callinc1();
在inc2.h
這樣你就不會需要包括在inc2.h文件inc1.h,但如果你不想在prog.cpp中刪除inc2_callinc1()的定義,那麼你需要包含inc1.h.
謝謝。我考慮過這一點,但並不認爲這樣的解讀會顯着減慢編譯速度。 – Anonymous 2009-12-23 04:22:57
我聽說過(http://www.efnetcpp.org/wiki/Include_guards)gcc和其他編譯器可能會緩存頭文件並自動識別包含的警衛。對此的性能損失可能可以忽略不計。 – 2009-12-23 04:25:00
這取決於項目的大小。對於需要兩分鐘編譯的內容,您將不會注意到其中的差異。對我們來說,我們每年進行一次#包括依賴性春季清潔,通常會在30分鐘內重建5-10分鐘。我聽說有些人甚至進一步採取這一步 - 而不是像編譯後鏈接的300個.cpp文件那樣,它們有6個.cpp文件,其中每個文件包含50個,因此編譯器會處理用更少的單位。他們已經說過它的編譯時間減半了,但在我們的例子中,它將編譯器的內存廢掉了! – Crashworks 2009-12-23 04:27:25