2010-10-15 96 views
10

我剛纔注意到我的程序使用字符串類進行編譯,但沒有包含<string>頭文件。事實證明,<iostream>包括<ios_base>,其中又包括<string>應該包含一個已經通過其他頭文件包含的頭文件嗎?

這是不好的做法,我應該明確包括<string>?即使這只是一個清晰的情況?

可以安全地認爲這適用於不僅僅是<string>標題?也許這是實現特定的,或者標準狀態<string>標題是否包含在<ios_base><iostream>?確保任何受到尊重和廣泛使用的實施將始終包括<string>提供<iostream>的呼叫存在。

+2

http://en.wikipedia.org/wiki/Incl ude_guard。標準庫有它們。 – Dragontamer5788 2010-10-15 20:36:35

+0

這很方便,因爲我很久沒有介紹過該功能。謝謝。 – aLostMonkey 2010-10-15 20:41:15

回答

10

你應該明確地包含你需要的任何標準庫頭。

沒有指定其他標準庫頭包含哪些標準庫頭,因此編譯器之間的這些細節會有所不同。

依賴於包含在其他標題中的標題的一種情況是,如果一個標題中的類來自另一個標題中的類。例如,<iostream>必須包含<ios_base>,因爲在<iostream>中定義的類是從<ios_base>中定義的類派生的。

+2

無論誰將應用程序移植到不同的操作系統或更新您的應用程序以使用其他編譯器構建,如果您遵循James McNellis關於此問題的建議,將會感謝您。相信我,在過去的一週裏,我不得不寫幾封尖刻的郵件,因爲人們沒有包含適當的標題。其他一些重要的:memset不在memory.h中,這是一個非標準的Microsoft主義。另一個例子:fabs和abs在stdlib.h中,而不是math.h. – George 2010-10-15 20:43:00

+3

@George:'晶圓廠'在''。整數類型形式參數的'abs'在''中,而'abs'用於浮點參數(在C++中,但我認爲不在C中)在''中。乾杯&hth。, – 2010-10-15 21:05:44

+0

@Alf P. Steinbach:你說的是晶圓廠,哎呀。 abs僅爲C++重載。由於我們使用C編譯器而不是C++編譯器編譯相同的代碼,因此必須使用fabs()替換一堆abs()調用。這就是我在咖啡因出來時發佈的內容。 :) – George 2010-10-15 21:16:33

7

一個好的做法是始終在給定的源文件中包含您將使用的類的標題,而不管您是否知道它們已包含在已包含的文件中。

如果在重構代碼時刪除了一個高級包含文件(例如iostream)的必要性,那麼確定應用程序不再編譯的原因可能會非常痛苦。

+3

+1在我接近單詞答案之前2秒,你用litteralically擊中提交按鈕。 – Anthony 2010-10-15 20:36:54

+0

如果你想要makefile的依賴性是準確的,那麼包含header就是* MUST *而不是* SHOULD *。 – jww 2015-09-27 11:01:56

2

如果您多次添加一個正確的頭文件(使用'#pragma once'或正確的#ifndef),它只會增加一點時間來編譯(只是爲了打開,解析和通過頭文件內容) ,但沒有太大的意思,它會讓你的文件更容易編譯,如果情況發生變化(例如將它們移動到不同的項目,將它們移出它們等等) 如果你真的關心編譯時間, IFNDEF包括頭(雖然我不建議這樣做)前

// header.h 
#ifndef _HEADER_H 
#define _HEADER_H 
int blahblahblah(int); 
#endif 


// cppfile.cpp 
#ifndef _HEADER_H 
#include <header.h> 
#endif