[英]include and using namespace in C++
使用cout
,我需要指定两个:
#include<iostream>
和
using namespace std;
cout
定义在哪里? 在iostream
,对吗? 那么, iostream
本身是否在命名空间std
?
关于使用cout
这两个语句的含义是什么?
我很困惑为什么我们需要将它们都包括在内。
iostream
是定义cout的文件的名称。 另一方面, std
是一个名称空间,与java的包相当(在某种意义上)。
cout是在stost命名空间内的iostream
文件中定义的实例。
在另一个命名空间中可能存在另一个cout
实例。 因此,为了表明您要使用std
命名空间中的cout
实例,您应该编写
std::cout
,表示范围。
std::cout<<"Hello world"<<std::endl;
要避免std::
everywhere,可以使用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
是,指定范围
如果您的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;
之后的某个地方using namespace std;
线它会寻找foo
各种不同的命名空间(类似范围),直到找到符合该行要求的FOO。 它以特定顺序搜索名称空间。 首先,它查看本地范围(实际上是一个未命名的命名空间),然后是下一个最本地的范围,直到一个函数外部一遍又一遍,然后在封闭对象的命名事物(在这种情况下为方法),然后在全局名称(函数,在这种情况下,除非你是愚蠢和重载(),我忽略),然后在std命名空间,如果你已经使用了using namespace std;
线。 我可能有最后两个错误的顺序(std可能在全局之前被搜索),但你应该避免编写依赖于它的代码。
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;
#include <iostream>
引用定义cout的头文件。 如果您要使用cout,那么您将始终需要包含。
您不需要using namespace std;
。 这只是允许你使用简写cout
和endl
等,而不是std::cout
和std::endl
,其中命名空间是显式的。 我个人不喜欢不using namespace ...
因为它要求我明确表达我的意思,尽管它确实更加冗长。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.