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

wa7juj8i  于 2023-07-01  发布在  其他
关注(0)|答案(4)|浏览(104)

为了使用cout,我需要指定两个:

#include<iostream>

using namespace std;

cout定义在哪里?在iostream中,对吗?所以,iostream本身在命名空间std中吗?

关于使用cout,这两个语句的含义是什么?
我不明白为什么我们需要把两者都包括在内。

gzszwxb4

gzszwxb41#

iostream是定义cout的文件名。另一方面,std是一个命名空间,在某种意义上相当于Java的包。
cout是在iostream文件中定义的示例,位于std命名空间内。
在另一个命名空间中可能存在另一个cout示例。因此,要指示您想要使用std名称空间中的cout示例,您应该编写
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语句并没有说“Hey,use the cout in std::“。这就是using的作用,指定作用域。

6vl6ewon

6vl6ewon2#

如果你的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可能在global之前搜索),但是你应该避免编写依赖于它的代码。

6vl6ewon

6vl6ewon3#

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;
z9gpfhce

z9gpfhce4#

#include <iostream>引用定义cout的头文件。如果你要使用cout,那么你总是需要include。
你不需要using namespace std;。这只是允许您使用简写coutendl等,而不是std::coutstd::endl,其中名称空间是显式的。就我个人而言,我不喜欢使用using namespace ...,因为它要求我明确表达我的意思,尽管它确实更冗长。

相关问题