簡體   English   中英

為什么cout需要頭字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM