2013-07-29 128 views
1

我有一個關於#include iosteam和向量的問題?在main.cpp,header.h或者memberfunction.cpp中?似乎我需要在main.cpp中使用命名空間標準,但#include < functional>在頭文件>中。有沒有強大的方法來做到這一點?謝謝!C++頭文件和包括

回答

3

簡單規則:
僅將頭文件包含在需要它的文件中。

如果您的源文件或頭文件沒有使用在頭文件中定義/聲明的任何構造,那麼就不需要包含該頭文件。這樣做只會將不必要的代碼帶入這些翻譯單元,從而破壞名稱空間並可能增加編譯時間。

+1

聽起來像一個很好的建議,但忽略了一點。 '#include'語句放在文件中。多個文件構成一個翻譯單元,按慣例一個.cpp文件和多個.h文件。由於問題是在哪裏放置'#include',特別是區分.cpp和.h文件,只是說「在TU中」實際上什麼也沒說。所有的C++代碼都在TU中,除此之外沒有別的。 – MSalters

+0

@ MSalters:很好指出。現在更正。 –

1

爲了便於閱讀,您只希望在使用它們的翻譯單元中包含標題。所以,在所有std::vector模板,你不會#include <vector>不使用的源代碼,所以你乾脆把包含在你自己的#include "myheader.h"

但是,您可能希望通過編譯前的頭以減少編譯時間。 正如我解釋in this answer,只有當你的所有程序都有一個包含所有包含的單一標題時,使用GCC預編譯的標題纔有效。出於這個原因,你會希望有一個單獨的myheader.h,它本身包括<vector>(即使是少數不使用它的編譯單元)。

頭文件的預編譯是編譯器(也許是系統)特定的。

0

如果您在header.h(例如,該類型的參數等)中以任何方式使用矢量或輸入/輸出流,則最好在其中包含iostream和/或vector。如果您僅在memberfunction.cpp的內部使用它們,請將其包含在其中(對代碼的其餘部分無用)。

+0

實際上,'iostream'完全是輸入或輸出流參數的錯誤頭。它只是定義了'std :: cout'等。流類型本身在''和''中定義。但是因爲你不需要參數的定義,只需要一個聲明,使用''。 – MSalters