#include ... // bunches of other things included
namespace std {
... // various things
extern istream cin;
extern ostream cout;
extern ostream cerr;
... // various other things
}
// explicit
std::cout << std::endl;
// import one symbol into your namespace (other symbols must still be explicit)
using std::cout;
cout << std::endl;
// import the entire namespace
using namespace std;
cout << endl;
// shorten the namespace (not that interesting for standard, but can be useful
// for long namespace names)
namespace s = std;
s::cout << s::endl;
4条答案
按热度按时间gzszwxb41#
iostream
是定义cout的文件名。另一方面,std
是一个命名空间,在某种意义上相当于Java的包。cout是在
iostream
文件中定义的示例,位于std命名空间内。在另一个命名空间中可能存在另一个
cout
示例。因此,要指示您想要使用std
名称空间中的cout
示例,您应该编写std::cout
,表示范围。要避免到处都是
std::
,可以使用using
子句。它们是两个不同的东西。一个指示范围,另一个实际包含
cout
。回复您的评论
假设iostream中存在两个名为
cout
的示例,它们位于不同的命名空间中:在包含
<iostream>
之后,仍然需要指定名称空间。#include
语句并没有说“Hey,use the cout in std::“。这就是using
的作用,指定作用域。6vl6ewon2#
如果你的C++实现使用C风格的头文件(很多都是),那么有一个文件包含类似于以下内容:
std是C++标准规定的大多数标准内容应该驻留的名称空间。这是为了避免全局命名空间的过度填充,这可能会导致您难以为自己的类,变量和函数命名,这些名称还没有用作标准名称。
通过说
你是在告诉编译器,你希望它在查找名字时,除了全局名字空间之外,还在名字空间std中搜索。如果编译器看到源代码行:
在
using namespace std;
行之后的某个地方,它将在各种不同的名称空间(类似于作用域)中查找foo
,直到找到满足该行要求的foo。它以一定的顺序搜索名称空间。它首先在局部作用域(实际上是一个未命名的名称空间)中查找,然后是下一个最局部的作用域,直到一遍又一遍地查找,直到函数外部,然后是封闭对象的命名对象(在本例中是方法),然后是全局名称(在本例中是函数,除非你愚蠢地重载了(),我忽略了它),然后在std命名空间(如果您使用了using namespace std;
行)。我可能把最后两个的顺序搞错了(std可能在global之前搜索),但是你应该避免编写依赖于它的代码。6vl6ewon3#
cout
在iostream中逻辑定义。逻辑上,我的意思是它实际上可能在iostream文件中,或者它可能在iostream中包含的某个文件中。无论哪种方式,包含iostream都是获得cout
定义的正确方法。iostream中的所有符号都在命名空间
std
中。要使用cout
符号,必须告诉编译器如何找到它(即什么命名空间)。你有几个选择:z9gpfhce4#
#include <iostream>
引用定义cout的头文件。如果你要使用cout,那么你总是需要include。你不需要
using namespace std;
。这只是允许您使用简写cout
和endl
等,而不是std::cout
和std::endl
,其中名称空间是显式的。就我个人而言,我不喜欢使用using namespace ...
,因为它要求我明确表达我的意思,尽管它确实更冗长。