关键词:< iostream > 和 < iostream.h >

关键词:< iostream > 和 < iostream.h > html

 
你写程序的时候,用< iostream >仍是< iostream.h >?
你知道它们有什么区别么?仍是认为他们根本就是同样的?
下面听我给你吹(文中纯属我的言论,不涉及国家机密,请放心阅读,若转载请注明出处做者^-^)
                              ---majianan
 
 
其实没有< 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的<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 >,获得的是置于全局空间的一样的元素。在全局空间获取元素会致使名字冲突,而设计名字空间的初衷正是用来避免这种名字冲突的发生。还有,打字时< iostream >比< iostream.h >少两个字,因此我会使用< iostream > ^-^
 
 ********************************************************************
另外的一篇文章:讲解iostream和iostream.h的区别

C++中新定义的方法都是有名字空间的 好比cout就属于std名字空间 若是include头文件的时候加上.h,默认会using namespace 不然须要本身加上 using namespace XXX 对于C中已经定义的方法如printf,没有影响的

iostream.h是包含输入/输出流处理的头文件,iostream就什么都不是了
但用iostream要加名词空间namespace

#include<iostream.h>
或者是
#include<iostream>
using namespace std;
两者都行

#include<iostream.h>是C语言中比较通用的
#include<iostream>
using namespace std;
是C++中比较通用的

#include <iostream.h>这样写,里面的函数都是全局函数.

不加.h的是如今C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免由于.h而形成的额外的处理和修改
而加.h的是c语言的用法,可是在c++中也支持这种用法,主要是为了向下兼容c 的内容,咱们平时尽可能不用这种方法
iostream是如今C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免由于.h而形成的额外的处理和修改。iostream包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程当中,库中有些部分的细节被修改了,因此旧头文件和新头文件中的实体不必定彻底对应。) 通常状况下应该用这个头文件,而iostream.h则是老式的,之后有可能被淘汰。
     ios

      常常在CSDN以及其余之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的每每就是那些刚学C++的新手。当初我是菜鸟的时候也问过相似的问题。c++

 

     如今来看看下面两个include:程序员

 

     #include<iostream>      // 这个就是1998年标准化之后的标准头文件函数

 

     #include<iostream.h>        // 这个就是标准化之前的头文件工具

 

 

 

     更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的iostream.h则将这些标准组件放在全局空间里,同时在标准化之后旧有的C标准库也已经通过改造了。 使用前者,就须要在代码中添加语句:using namespace std;开发工具

 

     看看下面这两个头文件spa

 

     // 标准化后通过改造的C的标准库,全部的组件都放在了std中设计

 

     #include<cstdio>           htm

 

     // 标准化之前C++中的C标准库

 

     #include<stdio.h>

 

     // 在看看这个头文件C标准库下 基于char* 的字符处理函数库

 

     #include<string.h>

 

     // 在标准化之后他变成了这样

 

     #include<cstring>

 

     // 可是不少朋友还看见过这个字符串处理函数库,他包含了新的string class

 

     #include<string>

 

 

 

     通过了标准委员会如此大规模手术后,在98年之前出品的C++编译器(BC3.0,BC5.0)上能顺利经过编译的源文件,在支持新标准的编译器上可能没法顺利经过编译也就是很正常的事了。

 

 

 

[原由]

 

     在回过头来看看标准程序库,这个程序库涵盖范围至关广大,提过了许许多多好用的功能。正是由于这样标准程序库中class的名称和函数名与第三方提供的程序库中的class名或是函数名发生名字冲突的可能性大大增大。为了不这个问题的发生,标准委员会决定将标准程序库中每同样东西都放在namespace std中。可是这么作同时有引来了一个新的问题。不少C++程序代码依赖那些已经存在不少年的C++ “准”标准程序库(C++迟迟未标准化才致使这些状况的发生),例如iosteam.h,complex.h等等。

 

 

 

     为了解决这个新出现的问题,标准化委员会决定设计一些新的头文件名,给那些穿上std外衣的组件所使用。把C++头文件的.h去掉,因而就有前面出现的iostream,一样C的头文件也作了相同的处理,同时在前面加上了一个字母c,以表示是C的头文件(感受上有中种族歧视的感受)。同时标准化委员会声明就有的C++头文件将再也不列于被支持的名单之中了,而旧有的C头文件为了知足“对C的兼容性”这个古老契约,仍然将继续存活下去。

 

可是,那些编译器厂商不可能去推翻他们客户的旧有编译器(也跟本不会去这么作),因此那些旧有的C++头文件仍然苟延残喘的活了下来,并不断的扰乱那些C++新兵的心智。

 

 

 

     下面就是如今大多数C++开发工具表示头文件的组织状态:

 

1.     旧的C++头文件 好比iostream.h,他们虽然被标准化委员会所抛弃,但因为各大厂商为了各自的商业利益仍然将继续存活下去,这些头文件的内容将不处于namespace std中。

 

2.     新的C++头文件如iostream虽然提供了和旧有头文件相同的功能,但他的内容都并入了namespace std中,从而有效避免了名字污染的问题。

 

3.     标准C的头文件如stdio.h继续得到支持,这类文件的内容并未放在std中。

 

4.     C函数库的技能也有对应的新式C++版本,起名称相似cstdio,这类头文件的内容也有幸穿上了std的外衣。

 

 

 

其实标准化之后的标准程序库的改动并不仅有这些而已,不少的标准化组件都被“tamplate化”。其中就有元老级人物iostream。标准程序库的问题并非用一篇,两篇文章就能够说清楚的。若是你像进一步的了解C++的标准程序库的话,你能够看看侯先生的《C++标准程序库》。

相关文章
相关标签/搜索