文档库 最新最全的文档下载
当前位置:文档库 › C++ using namespace详解

C++ using namespace详解

C++ using namespace详解
C++ using namespace详解

C++ using namespace详解

作者: 佚名, 出处:IT专家网,责任编辑: 谢妍妍,

2010-05-14 11:00

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

一:

和是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。

后缀为。h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带。h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀。h.

因此,当使用时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout.

二:

所谓namespace,是指标识符的各种可见范围。

C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

1、直接指定标识符。例如std::ostream而不是ostream.完整语句如下:

std::cout << std::hex << 3.4 << std::endl;

2、使用using关键字。

using std::cout;

using std::endl;

以上程序可以写成

cout << std::hex << 3.4 << endl;

3、最方便的就是使用using namespace std;

例如:

#include

#include

#include

using namespace std;

这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:

cout << hex << 3.4 << endl;

因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。

所以就有了和等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。

C++中,头文件与命名空间的关系

悬赏分:20 - 解决时间:2005-11-24 11:55

有些书说有些头文件不在std里是什么意思?std里包含些什么?为什么不用std就不能使用cout?头文件中声明的东西为什么在使用的时候需要先using namespace std;一下?

问题补充:

如果我不用#include和其他头文件。只用using namespace std 的话,是不能用cout的。这说明cout是在iostream里声明的,想不通既然声明了为什么还要using namespace一下?但是不using的话vc6报错cout 没有声明。不懂。

######################################

有些书说有些头文件不在std里是什么意思?

######################################

那些书那样说会造成困惑,因为名字空间,就像函数、

结构、类等等,是用代码来表达的一种语言机制。

std(standard的缩写)是标准C++里必须存在的一个

名字空间的名字。所有实现标准C++的编译器都

必须确保这空间的存在。

名字空间声明是这样表达的:

namespace x {

// 创建新名字

}

x是该名字空间的名字。

头文件装代码,代码表达名字空间。

所以应该说“有些头文件的内容不在std里”。

具体的意思就是,在那些头文件里,

没有任何代码是在“namespace std { }”的括号里的。

######################################

std里包含些什么?

######################################

std里包含标准C++库里的所有名字(类名、

函数名、...)。

######################################

为什么不用std就不能使用cout?

######################################

不是不能使用,只是不能直接写cout,必需用空间名和

名字空间限制符作为前缀,写成std::cout。

用某个名字做名字空间声明的时候,若已有同名的

名字空间存在,就是仅仅把括号里的名字加进去,

否则先创建空间,后加入括号里的名字。

加入名字空间后的名字都是对全局空间隐藏的,

但该名字空间的名字却不隐藏(除非该空间在另一个

名字空间里)。

cout隐藏在std里,但std本身不隐藏,所以

你“#include”了之后,不必做

使用声明便可直接用std,通过它访问cout。

若你做了使用声明,对该使用声明所处的作用域的隐藏便

被抵消(作用域的开端到声明之间的那段除外),

即不必使用空间名和名字空间限制符作为前缀。

######################################

头文件中声明的东西为什么在使用的时候需要

先using namespace std;一下?

######################################

你已经知道做使用声明是要讨个方便而不是一种必要。

我们作个总结性的复习吧。

(A)这简单的程序里只有全局和局部空间,没有其它的名字空间:

void main( ) {

std::cout << ""; // 错误:std不存在。

cout << ""; // 错误:std不存在cout就不用提了。

}

(B)这个则多了一个叫std的名字空间。std这名字也可见了:

#include

void main( ) {

std::cout << ""; // OK:可通过std骚扰cout。

cout << ""; // 错误:cout仍然被包在std里面,不可见。}

iostream头文件里有std的声明。在编译之前,

预处理器会用iostream里的全部内容来代替

“#include”这个预处理器指示符。

效果是,这程序包含iostream里的所有代码。

include是包含的意思。

包含指示是在全局空间里,所以在指示之后的任何地方,

std这个名字是可见、可访问的。

(C)这个不包含声明std的代码却尝试打开std包, 落了个跟(A)一样狼狈的下场:

using namespace std;

void main( ) {

std::cout << ""; // 错误:std不存在。

cout << ""; // 错误:std不存在cout就不用提了。}

(D)这个声明了std(曝露了std)并把std打开,

让里面的名字(cin、cout、cerr、...)跟

std一样暴露。

[相信你闭上眼都能写出这段代码了]

相关文档