9

对于使用cout,我需要同时指定:

#include<iostream>

using namespace std;

在哪里cout定义?中iostream,对吗?那么,它iostream本身是否存在于命名空间中std

关于 using ,这两个陈述的含义是什么cout

我很困惑为什么我们需要将它们都包括在内。

4

4 回答 4

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.
}

在 include 之后<iostream>,您仍然需要指定命名空间。该#include声明没有说“嘿,在 std:: 中使用 cout”。这就是using目的,指定范围

于 2010-04-15T18:56:07.063 回答
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++ 标准规定的大多数标准内容应该驻留的命名空间。这是为了避免过度填充全局命名空间,这可能会导致您难以为自己的类、变量和函数命名t 已经用作标准事物的名称。

通过说

using namespace std;

您告诉编译器您希望它在查找名称时除了全局名称空间之外还在名称空间 std 中进行搜索。如果编译器看到源代码行:

return foo();

在该行之后的某处,using namespace std;它将foo在各种不同的命名空间(类似于范围)中查找,直到找到满足该行要求的 foo。它按特定顺序搜索命名空间。首先它在本地范围(实际上是一个未命名的命名空间)中查找,然后是下一个最本地的范围直到一遍又一遍直到函数之外,然后在封闭对象的命名事物(在这种情况下为方法),然后在全局名称(函数,在这种情况下,除非你很愚蠢并且我忽略了重载 () ),然后在 std 命名空间,如果你使用了该using namespace std;行。我可能有最后两个顺序错误(std 可能在 global 之前搜索),但你应该避免编写依赖于它的代码。

于 2010-04-15T19:18:03.430 回答
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;
于 2010-04-15T18:58:18.417 回答
1

#include <iostream>引用定义 cout 的头文件。如果您要使用 cout,那么您将始终需要包含。

你不需要using namespace std;。这只是允许您使用速记coutendl,而不是在名称空间是显式的地方std::coutstd::endl就我个人而言,我不喜欢使用它,using namespace ...因为它要求我明确表达我的意思,尽管它确实更冗长。

于 2010-04-15T18:58:33.627 回答