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结果......)
所以这里有一些我到目前为止的问题:
iostream图书馆,为什么namespace需要找到cout?是否有另一个cout可能导致名称冲突的地方?如果有人可以为此提供图表,那就太好了.作为奖励,一些历史背景:
iostream.h它改变之前到底是什么iostream?
没有namespace起到这种变化的一部分?
bol*_*lov 20
所有标准库定义都在命名空间std中.也就是说它们没有在全局范围内定义,因此为了使用它们,您需要使用以下方法之一来限定它们:
std::coutusing namespace stdusing 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.