为什么在下面的代码中不包含“string”标题我可以声明字符串变量。 但是当我尝试打印字符串时,编译器只会抱怨cout。
“string”标题包含哪些信息?
#include <iostream>
//#include "string"
int main ()
{
std::string str="SomeWorld";
std::cout<<str<<std::endl;
return 0;
}
答案 0 :(得分:12)
因为std::basic_string
最有可能(间接)包含定义<iostream>
的标头(std::string
是基于std::basic_string<char>
的typedef)。但operator<<
std::cout
的重载仅在<string>
中定义。
答案 1 :(得分:2)
std::cout
不需要它,std::string
需要它。
答案 2 :(得分: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
中),但以上是符合标准的方式。< / p>
答案 3 :(得分:0)
<string>
标头包含string
类的定义(注意:#include "string"
表示将string
文件包含在当前目录中,因此您应该使用尖括号对于系统包含而不是"
。)
但是,iostream
已包含string
,(例如,声明适用于operator<<
的{{1}})因此这就是您不需要包含的原因在这种情况下。
在任何情况下,最好包含您需要的标题。这使您的代码更具可移植性,并且在您将该代码复制到另一个上下文(例如,不包含std::string
作为先前的包含)的情况下更加明确。另请注意,永远不会指定,例如,包括iostream
会使iostream
可用,因此严格来说,您必须包含std::string
才能使用string
。< / p>
答案 4 :(得分:-2)
因为<string>
中包含<iostream>
。这就是编译器没有抱怨的原因。