为什么cout需要头字符串

Why header string is required for cout?

本文关键字:字符串 cout 为什么      更新时间:2023-10-16

为什么在下面的代码中不包括"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>的类型定义)。operator<<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文件,因此您应该使用尖括号代替"来表示系统包含)

然而,iostream已经包含了string,(例如,声明operator<<适用于std::string)所以这就是为什么在这种情况下你不需要包含它的原因。

在任何情况下,包含你只需要的头是一个很好的做法。这使您的代码更具可移植性,并且在将该代码复制到另一个上下文中(例如,不包含iostream作为先前包含的上下文中)时更显式。此外,请注意,它从未指定,例如,包括iostream将使std::string可用,所以严格地说,您必须包括string才能使用std::string

因为<string>包含在<iostream>中。