2013-09-29 34 views
5

爲什麼我不需要包含cstdlib,如何禁用它?我使用的代碼::塊與GCC編譯器在Windows 7C++代碼編譯時不包含

#include <iostream> 

using std::cout; 
using std::endl; 

int main() 
{ 
    cout << "Hello" << endl; 

    system("pause"); 
    return 0; 
} 
+0

看起來'cstdlib'被'iostream'包含。至少在GCC 4.7.3上似乎是這種情況。 – juanchopanza

+0

你的問題似乎是一個普遍(錯誤)理解的一部分,當文檔中寫有「如果你做X,你可以做Y」時,你認爲你有保證不做X會導致Y出錯。大部分情況並非如此。你必須做X才能證明Y是合法的。 –

回答

7

你並不需要包括<cstdlib>因爲它(或含有system()它的一部分)被列入由<iostream>。沒有指定標準頭文件是否包含或者包含哪些其他(標準)頭文件。您不能禁用此行爲,但應該意識到這一點,以避免不同標準庫實現之間的可移植性問題。

您不應該依賴於此行爲並且自己包含<cstdlib>。您還應該使用std::system而不是全球system<c*>標題中的函數只能保證位於std名稱空間(全局名稱空間,另一方面位於<*.h>標題中)。

4

我使用MS的Visual Studio 2012,並在其中,< iostream>包括<istream>,其包括<ostream>包括<ios>包括<xlocnum><xlocnum>包括<cstdlib>,所以你的程序間接包含<cstdlib>

雖然序列包括可能是在其他的編譯器和/或實施的不同,這代碼運行的原因在於,<iostream>,無論是直接或間接地包括<cstdlib>

需要注意的是,iostream包含的庫是特定於實現的,並且代碼可能無法在某些其他編譯器中編譯。作爲一般規則,頭文件包含的庫通常沒有很好的記錄或部分標準,所以不要依賴間接包含。如果您需要一個庫,請直接包含它,並且由於標準庫爲include guarded,因此在您的程序編譯或運行時不會產生重要的overhead

+0

你讓它聽起來像間接包含在所有實現中都必須存在。不是這種情況。 – juanchopanza

+0

你會更具體一點嗎? – MxNx

+0

我的意思是'iostream'可能不會拉'cstdlib',但你會聽起來像它總是這樣。 – juanchopanza