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

时间:2010-04-15 18:50:32

标签: c++ include using using-statement

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

#include<iostream>

using namespace std;

cout在哪里定义?在iostream中,对吗?那么,iostream本身是名称空间std吗?

关于使用cout的两个陈述的含义是什么?

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

4 个答案:

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