繁体   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