iostream和命名空间std之间的关系是什么?
iostream和命名空间std之间的关系是什么?
我目前正在使用《Teach Yourself C++ in 21 Days, Second Edition》这本书和Microsoft Visual C++ 2010 Express来学习C++编程。在第一章的末尾,有一个关于编写和编译以下代码的小练习:
#includeint main() { cout << "Hello World!\n"; return 0; }
看起来很简单,对吧?但是让我惊讶的是,代码无法编译,因为出现了以下错误:
error C2065: 'cout' : 未声明的标识符
我开始搜索网络,很快在这里找到了一些解决方案:here。原来我需要在代码中添加`using namespace std;`!
然而,在书中没有提到命名空间的内容,所以我觉得这本书已经过时了。(它使用了`#include
所以,我有一些问题:
- 如果我包含了`iostream`库,为什么还需要`namespace`来找到`cout`?是否有其他可能导致名称冲突的`cout`?如果有人能提供一个关于此的图表,那就太好了。
作为额外的奖励,一些历史背景:
- 在更改为`iostream`之前,`iostream.h`到底是什么?
- `namespace`在这个变化中起了什么作用?
iostream和namespace std之间的关系是,iostream文件包含了一些代码,可以让C++程序在屏幕上显示输出并从键盘上接收输入。而namespace std是一个命名空间,它包含了iostream文件中创建的所有名称。
问题的出现是因为在程序中使用了#include
指令来包含iostream文件,但在使用iostream文件中的名称时,并没有指明这些名称属于哪个命名空间。为了解决这个问题,我们可以在程序中添加using namespace std;
语句,它声明程序将访问属于"std"命名空间的实体。
通过使用using namespace std;
语句,我们可以直接使用iostream文件中定义的名称,而不需要在每个名称前面加上"std::"前缀。这样可以简化代码的编写,并且使程序更易读。
,iostream文件提供了显示输出和接收输入的功能,而使用using namespace std;
语句可以方便地访问iostream文件中定义的名称。这两者之间的关系是,iostream文件中定义的名称属于std命名空间。
#include
using namespace std;
int main() {
cout << "Hello, world!" << endl;
return 0;
}
上述代码中,我们使用了iostream库中的cout对象来输出字符串"Hello, world!"。在代码中,我们使用了using namespace std;来引入std命名空间,这样我们就可以直接使用std命名空间中的cout对象,而不需要写成std::cout。
那么,为什么在使用iostream库时需要使用命名空间std呢?这是因为C++标准要求cout对象必须在std命名空间中。这样设计的目的是为了避免命名冲突。虽然在标准库中可能不存在与cout同名的对象,但在自己的代码或第三方库中可能存在与cout同名的对象,为了避免冲突,将cout放在std命名空间中是一种好的设计选择。
至于iostream.h在被改为iostream之前是什么,它可以是任何东西,因为它不是标准的一部分。但它是一个预标准化头文件的名称,为iostream提供了基础。通常,它在全局命名空间中声明所有名称,所以你看到的示例代码很可能是在标准化之前编写的。
至于命名空间是否在这个改变中起到了作用,这个问题不太清楚。命名空间关键字namespace可能在实现中使用,并且用于在命名空间中声明和定义数据、函数、类型等。所以它在这个改变中确实起到了一定的作用。
总结起来,使用iostream库时需要使用命名空间std来引入std命名空间中的cout对象。这样设计是为了避免命名冲突,将cout放在std命名空间中是一种好的设计选择。而iostream.h是iostream库在标准化之前的一个预标准化头文件,它的存在基本上是为了提供iostream的基础功能。至于命名空间是否在这个改变中起到了作用,这个问题不太清楚,但命名空间关键字namespace在C++中的确起到了一定的作用。
iostream和namespace std之间的关系是什么?
这个问题的出现是因为所有的标准库定义都在命名空间std中。也就是说它们不是在全局范围内定义的,所以为了使用它们,你需要以以下方式之一进行限定:
- std::cout
- using namespace std
- using std::cout
举个例子,我们来看一下下面的代码:
// 声明
int global_variable;
namespace n {
int variable2;
}
global_variable可以直接访问:
int x;
x = global_variable;
但是variable2不是全局空间的一部分,而是namespace n的一部分。
int x;
x = variable2; // 错误,找不到变量标识符variable2。
所以你必须使用完全限定名:
int x;
x = n::variable2;
作为一种快捷方式,你可以这样写:
using namespace n;
int x;
x = variable2; // 在当前命名空间和所有使用了using namespace的命名空间中搜索variable2
// 只在命名空间n中找到 -> 正确
或者也可以这样写:
using n::variable2; // 这将使得对`variable2`的任何非限定引用都解析为`n::variable2`
int x;
x = variable2;
至于头文件,iostream.h在标准化之前被许多编译器使用。当委员会试图进行标准化时,他们决定使C++头文件没有扩展名,以避免与现有代码的兼容性问题。