C++标准库和命名空间

来源:互联网 发布:白城广逸网络地点 编辑:程序博客网 时间:2024/04/30 18:41

一、#include<iostream>和#include"iostream.h"的区别

     简单点说,“***.h”这种用法是以前的版本,<**>是现在C++标准的用法。而旧的C++头文件是官方所反对使用的(即明确列出不再支持),但旧的C头文件则没有(以保持对C的兼容性)。

    从功能性的角度来讲,<iostream>包含了一系列模板化的I/O类,相反地“iostream.h”只仅仅是支持字符流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此,<iostream>和<iostream.h>在接口和执行上都是不同的。最后,<iostream>的各组成都是以STL(Standard Template Library,标准模板库)的形式声明的,然而<iostream.h>的各组成都是声明成全局型的。

        因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习惯,在新的代码中一般使用<iostream>,但如果你处理的是过去编写的代码,为了继承可以用继续用<iostream.h>就保持代码的一致性。
   
      <iostream>表示你使用的是标注命名空间,也就是在程序开始应该有这么一句话
      using namespace std ; 这是遵循c++标准的
     <iostream.h> 则没有遵循c++标准
    
     <string.h>是旧的C头文件,对应的是基于char*的字符串处理函数;
    <string>是包装了std的C++头文件,对应的是新的strng类;
    <cstring>是对应旧的C头文件的std版本。
    #include <iostream.h> 和 #include <iostream>
    前一个不是c++标准中的,后一个在c++标准中
    还有就是平时我们所用的两种情况,当有输出和输入流时就要注意了。
    换成#include <iostream>,要加一句using namespace std;或把cout改成std::cout,end改成std::endl等等

二、using namespace std;

       有时会出现这种错误:error C2871: 'std' : does not exist or is not a namespace。下面分析可能的原因

       应该是把新标准和过时的用法混用了,譬如#include"string.h"     #include"iostream.h"   using namespace std;用了过时的库,却又用现在标准的命名空间,可定报错啊。所以,建议除非在不得已的情况下,用现在的标准。

       使用命名空间程序员可以避免与库中定义的名字相同而引起无意冲突。因为标准库定义的名字是定义在命名空间中,所以我们可以按自己的意图使用相同的名字。

      

话说当年,在标准化委员会动手重建新的标准库的时候,遇到了问题。为了避类名和函数名的冲突问题,引入了名字空间std。但无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,例如,声明在< iostream.h > 和< complex.h > 等头文件中的功能。现有软件没有针对使用名字空间而进行相应的设计或升级,如果用std来包装标准库导致现有代码不能使用,那手底下的小弟(程序员)是不会同意的。
        标准化委员会为了拉拢人心,吸引更多的人入会,决定为包装了std的那部分标库构建新的头文件名。将现有C++头文件名中的.h去掉,所以就出现了< iostream.h> 和< iostream > 等很多双胞胎。对于C头文件,采用同样方法但在每个名字前还要添加一个C,所以C的<string.h> 变成了<cstring>。
      旧的C++头文件是官方明确反对使用的,但旧的C头文件则没有(以保持对C的容性)。其实编译器制造商不会停止对客户现有软件提供支持,所以在可以预计的将来,旧的C++头文件还会嚣张一段时间。如果能明白字符串头文件的使用,举一反三,其他的也差不多会用了。
  • <string.h> 是旧的C头文件,对应的是基于char*的字符串处理函数;
  • <string> 是包装了std的C++头文件,对应的是新的strng类;
  • <cstring> 是对应旧的C头文件的std版本。
         如果你的编译器都同时支持< iostream > 和< iostream.h >,那使用 #include < iostream >,得到的是置于名字空间std下的iostream库的元素;果使用 #include < iostream.h >,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致名字冲突,而设计名字空间的初衷正是用来避免这种名字冲突的发生。

       

0 0
原创粉丝点击