2011-07-25 27 views
3

爲什麼在下面的代碼中不包含「string」頭我可以聲明字符串變量。 但是,當我嘗試打印字符串時,編譯器只對cout抱怨。cout爲什麼需要標題字符串?

什麼信息「字符串」標題包含?

#include <iostream> 
//#include "string" 

int main() 
{ 
    std::string str="SomeWorld"; 

    std::cout<<str<<std::endl; 

    return 0; 
} 

回答

12

因爲定義std::basic_string的標頭最有可能(間接)包含在<iostream>std::string是基於std::basic_string<char>的typedef)。然而std::coutoperator<<的過載僅在<string>中定義。

+0

在Visual C++的情況下,''包含實現定義的''頭,它定義了'basic_string'本身,但是像你說的那樣,它沒有定義'operator <<'。 – Sven

2

它不是必需的std::cout,它需要std::string

+0

++。不包括「字符串」頭我可以聲明std :: string變量。編譯器允許這樣做。 – vrbilgi

+0

@user - 允許一個C++頭包含任何其他頭文件。你不能依賴這個,因爲它從一個編譯器到另一個不同。你應該總是包含你需要的頭文件。 –

+0

@ user430294:您始終需要一個包含該類型的頭文件。其他一切都是實現的東西,而不是你可以依賴的東西。 –

0

<string>頭包括string類的定義(注:#include "string"意味着包括string文件在當前目錄中,所以你應該使用尖括號而不是"系統包括。)

然而,iostream已包含string(例如,聲明operator<<適用於std::string),所以這就是爲什麼您不需要在此情況下包含它的原因。

在任何情況下,包含您剛纔需要的標題是一種很好的做法。這使得您的代碼更具可移植性,並且在您將代碼複製到另一個上下文中的情況下更加明確,例如,不包括iostream作爲之前的包含。此外,請注意,從未指定,例如,包括iostream將使std::string可用,因此嚴格來說,您必須包含string才能使用std::string

-2

因爲<string>包含在<iostream>中。這就是編譯器不抱怨的原因。

+0

提問者報告說編譯器*會*抱怨。 –

+0

我認爲投票一次就夠了。 – sap

2

嚴格地說,除非你包含全部正確的標題,否則任何事情都可能發生。沒有必要將一個標準頭文件包含在其他文件中。所以要便攜和正確的,你要這樣說:

#include <string> // for `std::string` 
#include <ostream> // for `std::ostream &` in `operator<<` 
#include <iostream> // for std::cout 

int main() { 
    std::string str = "hello world"; 
    std::cout << str << std::endl; 
} 

在任何實際的實現,你可以幾乎總是與省略某些標題脫身(如ostream很可能已被列入iostream),但以上是符合標準的方式。

相關問題