使用cout
,我需要同时指定:
#include<iostream>
和
using namespace std;
cout
在哪里定义?在iostream
中,对吗?那么,iostream
本身是名称空间std
吗?
关于使用cout
的两个陈述的含义是什么?
我很困惑为什么我们需要将它们都包括在内。
答案 0 :(得分:9)
iostream
是定义cout的文件的名称。
另一方面,std
是一个名称空间,与java的包相当(在某种意义上)。
cout是在iostream
文件中定义的实例,位于std命名空间内。
在另一个名称空间中可能存在另一个cout
实例。因此,为了表明您要使用cout
命名空间中的std
实例,您应该编写
std::cout
,表示范围。
std::cout<<"Hello world"<<std::endl;
为了避免在任何地方std::
,您可以使用using
子句。
cout<<"Hello world"<<endl;
他们是两回事。一个表示范围,另一个表示实际包含cout
。
想象一下,在iostream中,名为cout
的两个实例存在于不同的命名空间
namespace std{
ostream cout;
}
namespace other{
float cout;//instance of another type.
}
包含<iostream>
后,您仍需要指定命名空间。 #include
语句没有说“嘿,在std ::中使用cout”。这就是using
的用途,指定范围
答案 1 :(得分:2)
如果您的C ++实现使用C样式头文件(很多都是),那么有一个文件包含类似于:
的文件#include ... // bunches of other things included
namespace std {
... // various things
extern istream cin;
extern ostream cout;
extern ostream cerr;
... // various other things
}
std是C ++标准所说的大多数标准事物应该存在的命名空间。这是为了避免过度填充全局命名空间,这可能会导致您难以为自己的类,变量和函数提供名称它们尚未被用作标准物品的名称。
说
using namespace std;
您正在告诉编译器,在查找名称时,除了全局命名空间之外,还希望它在命名空间std中进行搜索。 如果编译器看到源代码行:
return foo();
在using namespace std;
行之后的某个地方,它将在各种不同的命名空间(类似于范围)中查找foo
,直到找到满足该行要求的foo为止。它以特定顺序搜索名称空间。首先,它查看本地范围(实际上是一个未命名的命名空间),然后是下一个最本地的范围,直到一个函数外部一遍又一遍,然后在封闭对象的命名事物(在这种情况下为方法),然后在全局名称(函数,在这种情况下,除非你是愚蠢和重载(),我忽略了),然后在std命名空间,如果你使用了using namespace std;
行。我可能有最后两个错误的顺序(std可能在全局之前被搜索),但你应该避免编写依赖于它的代码。
答案 2 :(得分:1)
cout
在iostream中进行逻辑定义。从逻辑上讲,我的意思是它实际上可能在文件iostream中,或者它可能在iostream包含的某个文件中。无论哪种方式,包括iostream都是获得cout
定义的正确方法。
iostream中的所有符号都在命名空间std
中。要使用cout
符号,必须告诉编译器如何找到它(即什么命名空间)。你有几个选择:
// 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;
答案 3 :(得分:0)
#include <iostream>
引用定义cout的头文件。如果您打算使用cout,那么您将始终需要包含。
您不需要using namespace std;
。这只是允许您使用简写cout
和endl
等,而不是名称空间明确的std::cout
和std::endl
。我个人不喜欢使用using namespace ...
,因为它要求我明确表达我的意思,尽管它更加冗长。