繁体   English   中英

在C ++中包含和使用命名空间

[英]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; 这只是允许你使用简写coutendl等,而不是std::coutstd::endl ,其中命名空间是显式的。 我个人不喜欢不using namespace ...因为它要求我明确表达我的意思,尽管它确实更加冗长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM