一 :
后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
因此,当使用
二:
所谓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++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。
所以就有了
命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"
新的c++标准是使用了名称空间的,所以要使用上面一种用法
#include
using namespace std ;
这是遵循c++标准的
相反,"iostream.h" 则没有遵循c++标准 ,这是老式的命名方式 ,延承自C语言
其实没有 < iostream.h > 这样的东西 --- 标准化委员会在简化非C标准头文件时用 < iostream > 取代了它。但又没有完全取消 < iostream.h > 的使用,并且很多编译器都同时支持 < iostream > 和 < iostream.h > ,造成现在的局面,老大(标准化委员会)确实有不得已的苦衷。
话说当年,在标准化委员会动手重建新的标准库的时候,遇到了问题。为了避免类名和函数名的冲突问题,引入了名字空间std。但无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,例如,声明在 < iostream.h > 和 < complex.h > 等头文件中的功能。现有软件没有针对使用名字空间而进行相应的设计或者升级,如果用std来包装标准库导致现有代码不能使用,那手底下的小弟(程序员)是不会同意的。
标准化委员会为了拉拢人心,吸引更多的人入会,决定为包装了std的那部分标准库构建新的头文件名。将现有C++头文件名中的.h去掉,所以就出现了 < iostream.h> 和 < iostream > 等很多双胞胎。对于C头文件,采用同样方法但在每个名字前还要添加一个C,所以C的
旧的C++头文件是官方明确反对使用的,但旧的C头文件则没有(以保持对C的兼容性)。其实编译器制造商不会停止对客户现有软件提供支持,所以在可以预计的将来,旧的C++头文件还会嚣张一段时间。
如果能明白字符串头文件的使用,举一反三,其他的也差不多会用了。
跑远了,言归正传。如果你的编译器都同时支持 < iostream > 和 < iostream.h >,那使用 #include < iostream >,得到的是置于名字空间std下的iostream库的元素;如果使用 #include < iostream.h >,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致名字冲突,而设计名字空间的初衷正是用来避免这种名字冲突的发生。还有,打字时 < iostream > 比 < iostream.h > 少两个字,所以我会使用 < iostream >
iostream.h是vc4.2版本之前的,iostream是之后的,主要是:
4,2版本之后,把standard C++ library加了进来,把原来的C Run_time library 中的iostream library移出,形成了一个单独的库,同时,standard C++ library中也有新的iostream函数,并且这两个新旧版本的iostream库不兼容,不能在同一个程序中调用.
而using namespace std;是使用一个叫 std的 名字空间 后面调用什么东西的时候就不用谢啦。
VC6.0及以前的版本使用
而以后的版本则使用
这是因为C或C++并是Microsoft才有,其实它已经属于全世界了.开始头文件是用后缀.h的,但并不是所有的人都这么做了.有的人用了其它的后缀.为了统一.C++新标准规定头文件就不用任何后缀了.除了
using namespace 是引用名字空间.
名字空间是怕命名污染而提出来的.比如你也取一个变量名为cout.这样就会冲突.
自VC6.0版以后
这样引用cout就变成std::cout了.如果量一大就觉得不方便.所以又产生了导入名字空间.就是这句.using namespace std;
这样在使用上就跟VC6.0一样来了.其实功能上没有什么差异.只是为了更符合C++标准.那么这个C++标准是谁定的呢?说来话长.你自己可以再搜一下.