[英]Why header string is required for cout?
為什么在下面的代碼中沒有包含“string”標題我可以聲明字符串變量。 但是當我嘗試打印字符串時,編譯器只對cout抱怨。
“字符串”標題包含哪些信息?
#include <iostream>
//#include "string"
int main ()
{
std::string str="SomeWorld";
std::cout<<str<<std::endl;
return 0;
}
因為定義std::basic_string
的頭很可能(間接地)包含在<iostream>
( std::string
是一個基於std::basic_string<char>
的typedef)。 但是, operator<<
for std::cout
的重載僅在<string>
定義。
它不是std::cout
所必需的,它是std::string
必需的。
嚴格來說,除非包含所有正確的標題,否則任何事情都可能發生。 沒有強制將一個標准標題包含在任何其他標准標題中。 所以為了便攜和正確,你必須這樣說:
#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
),但以上是符合標准的方式。
<string>
標頭包含string
類的定義(注意: #include "string"
表示將string
文件包含在當前目錄中,因此您應該使用尖括號而不是"
for system includes”。)
但是, iostream
已經包含了string
,(例如,聲明operator<<
適用於std::string
)所以這就是為什么在這種情況下你不需要包含它。
無論如何,最好包含您需要的標題。 這使得您的代碼更具可移植性,並且在您將該代碼復制到另一個上下文(例如,不包含iostream
作為先前的包含)的情況下更加明確。 另外,請注意,永遠不會指定,例如,包括iostream
將使std::string
可用,因此嚴格來說,您必須包含string
才能使用std::string
。
因為<string>
包含在<iostream>
。 這就是編譯器沒有抱怨的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.