iostream和命名空间std之间有什么关系?

IDD*_*DQD 20 c++ namespaces c++11

我目前正在使用" 自学C++ 21天,第二版"一书来学习C++编码,以及Microsoft Visual C++ 2010 Express.在第1章的最后,有一个关于编写和编译以下代码的小练习:

#include <iostream>

int main ()
{
    cout << "Hello World!\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

很简单吧?但令我惊讶的是,由于此错误,代码无法编译:

错误C2065:'cout':未声明的标识符

我开始淘网,并很快找到了一些解决方案在这里.原来我必须添加 using namespace std;到我的代码!

但是书中没有提到命名空间,所以我认为这本书已经过时了.(它使用#include <iostream.h>预处理器指令!)一些网络研究后,我发现了很多关于命名空间的信息,namespace std与一些历史背景以及<iostream.h><iostream>,以及新信息的所有这种流动是相当混乱给我.(更不用说关于医疗性病的所有不必要的Google结果......)

所以这里有一些我到目前为止的问题:

  1. 如果我包括iostream图书馆,为什么namespace需要找到cout?是否有另一个cout可能导致名称冲突的地方?如果有人可以为此提供图表,那就太好了.

作为奖励,一些历史背景:

  1. iostream.h它改变之前到底是什么iostream

  2. 没有namespace起到这种变化的一部分?

bol*_*lov 20

所有标准库定义都在命名空间std中.也就是说它们没有在全局范围内定义,因此为了使用它们,您需要使用以下方法之一来限定它们:

  • std::cout
  • using namespace std
  • using std::cout

例如,让我们来看看:

// declarations
int global_variable;

namespace n {
int variable2;
}
Run Code Online (Sandbox Code Playgroud)

global_variable 可以按原样访问:

int x;
x = global_variable;
Run Code Online (Sandbox Code Playgroud)

但变量2不是全球空间的一部分,而是全球空间的一部分namespace n.

int x;
x = variable2; // error variable2 identifier not found.
Run Code Online (Sandbox Code Playgroud)

所以你必须使用完全限定的名称:

int x;
x = n::variable2;
Run Code Online (Sandbox Code Playgroud)

作为捷径,你可以写:

using namespace n;
int x;
x = variable2; // variable2 is searched in current namespace
               // and in all namespaces brought in with using namespace
               // Found ONLY in namespace n -> OK
Run Code Online (Sandbox Code Playgroud)

要么

using n::variable2; // this makes any unqualified reference to `variable2`
                    // to be resolved to `n::variable2`
int x;
x = variable2;
Run Code Online (Sandbox Code Playgroud)

至于头文件,iostream.h在有标准之前被许多编译器使用.当委员会试图标准化时,他们决定使C++标头无扩展,以免破坏与现有代码的兼容性.


小智 7

因为这行开头#,所以它被称为"预处理器指令".预处理程序在编译之前读取程序,并仅执行以...开头的那些行#.预处理器为编译器设置源代码.

#include指令使预处理器将另一个文件的内容包含在程序中.该iostream文件包含允许C++程序向屏幕显示输出并从键盘输入的代码.这些iostream文件在#include指令出现时包含在程序中.它iostream被称为头文件,出现在程序的顶部或头部.

using namespace std;

C++使用命名空间来组织名称或程序实体.它声明该计划将评估属于被namespace称为"标准"的实体.iostream文件创建的每个名称都是其中的一部分namespace.