爲什麼我不需要包含cstdlib,如何禁用它?我使用的代碼::塊與GCC編譯器在Windows 7C++代碼編譯時不包含
#include <iostream>
using std::cout;
using std::endl;
int main()
{
cout << "Hello" << endl;
system("pause");
return 0;
}
爲什麼我不需要包含cstdlib,如何禁用它?我使用的代碼::塊與GCC編譯器在Windows 7C++代碼編譯時不包含
#include <iostream>
using std::cout;
using std::endl;
int main()
{
cout << "Hello" << endl;
system("pause");
return 0;
}
你並不需要包括<cstdlib>
因爲它(或含有system()
它的一部分)被列入由<iostream>
。沒有指定標準頭文件是否包含或者包含哪些其他(標準)頭文件。您不能禁用此行爲,但應該意識到這一點,以避免不同標準庫實現之間的可移植性問題。
您不應該依賴於此行爲並且自己包含<cstdlib>
。您還應該使用std::system
而不是全球system
。 <c*>
標題中的函數只能保證位於std
名稱空間(全局名稱空間,另一方面位於<*.h>
標題中)。
我使用MS的Visual Studio 2012,並在其中,< iostream>
包括<istream>
,其包括<ostream>
包括<ios>
包括<xlocnum>
。 <xlocnum>
包括<cstdlib>
,所以你的程序間接包含<cstdlib>
雖然序列包括可能是在其他的編譯器和/或實施的不同,這代碼運行的原因在於,<iostream>
,無論是直接或間接地包括<cstdlib>
。
需要注意的是,iostream
包含的庫是特定於實現的,並且代碼可能無法在某些其他編譯器中編譯。作爲一般規則,頭文件包含的庫通常沒有很好的記錄或部分標準,所以不要依賴間接包含。如果您需要一個庫,請直接包含它,並且由於標準庫爲include guarded,因此在您的程序編譯或運行時不會產生重要的overhead。
你讓它聽起來像間接包含在所有實現中都必須存在。不是這種情況。 – juanchopanza
你會更具體一點嗎? – MxNx
我的意思是'iostream'可能不會拉'cstdlib',但你會聽起來像它總是這樣。 – juanchopanza
看起來'cstdlib'被'iostream'包含。至少在GCC 4.7.3上似乎是這種情況。 – juanchopanza
你的問題似乎是一個普遍(錯誤)理解的一部分,當文檔中寫有「如果你做X,你可以做Y」時,你認爲你有保證不做X會導致Y出錯。大部分情況並非如此。你必須做X才能證明Y是合法的。 –