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