C++新手必问之头文件

原创 2003年08月24日 16:57:00

[结果]

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

       现在来看看下面两个include:

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

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

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       更本质上的区别就是iostream把标准C++库的组件放在一个名位stdnamespace里面。而相对的iostream.h则将这些标准组件放在全局空间里,同时在标准化以后旧有的C标准库也已经经过改造了。

       看看下面这两个头文件

       // 标准化后经过改造的C的标准库,所有的组件都放在了std

       #include<cstdio>                    

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

       #include<stdio.h>

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

       #include<string.h>

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

       #include<cstring>

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

       #include<string>

 

       经过了标准委员会如此大规模手术后,在98年以前出品的C++编译器(BC3.0BC5.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++标准程序库》。

 

 

[参考文献]

       Stanley B.Lippman 潘爱民等译,C++ Primer3rd Edition,中国电力出版社,2002年。

       Scott Meyers 侯捷译,Effective C++,2nd Edition,华中科技大学出版2001年。

C++新手必问之头文件

 C++新手必问之头文件经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。    现在来看看下面两个in...
  • adcxf
  • adcxf
  • 2008年01月26日 20:53
  • 475

C++新手必问之头文件

 经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。     现在来看看下面两个include:    ...
  • SearchLife
  • SearchLife
  • 2008年12月15日 12:27
  • 575

转:C++新手必问之头文件

经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。     现在来看看下面两个include:   ...
  • zhangleo1987
  • zhangleo1987
  • 2010年06月08日 07:44
  • 482

面试一定要看的

1  数据库的索引,你怎么理解的?    添加索引可以使数据查找的速度更快  但是不是说给个字段都要加上索引 因为这样的话  速度反而会下降 要根据需要经常用的字段      有所选择的添加索引;但...
  • qq_35712550
  • qq_35712550
  • 2016年12月14日 10:46
  • 211

C++面试常见题目问与答(汇总一)

总结了一些C++常见的面试题,只是关于C++纯语言的面试题 经验不足,水平有限,希望读者能提出宝贵的意见~~~~...
  • charles_r_chiu
  • charles_r_chiu
  • 2015年08月22日 13:31
  • 10464

C++ 不用头文件直接定义类

class Person { public: void Test() { cout } };
  • imJaron
  • imJaron
  • 2017年02月28日 18:09
  • 286

javascript一些面试常用的问题总结

有关函数调用变量问题 var a =10; function aaa(){ alert(a); } function bbb(){ var a...
  • yilanyoumeng3
  • yilanyoumeng3
  • 2015年06月24日 12:47
  • 1145

c++ 头文件中定义函数的优缺点

最近看caffe 代码, 有些头文件中 ,直接实现了该函数。 以前了解到是 头文件尽量不要实现, 放到cpp中实现, 短小的程序也可以实现。但是为什么这样,头文件实现有什么优缺点不是很清晰。基于这个,...
  • u014114990
  • u014114990
  • 2015年08月25日 09:08
  • 2085

C++模板类代码只能写在头文件?

这个问题,实际上我几年前就遇到了。最近写个模板类玩的时候,再次遇到。  当我非常仔细的将定义和实现分开,在头文件中保留了最少的依赖后,一切就绪.cpp单独编过。但是当使用的时候,就会报告所有的函数调用...
  • jinzeyu_cn
  • jinzeyu_cn
  • 2015年05月17日 20:54
  • 1022

C++头文件用<>还是“” 以及 要加.h还是不加 的问题

1.C++头文件用包含还是” “?答:用包含,编译器会先在系统目录下搜索; 用” ” 包含,编译器会先在用户目录下搜索。 所以,如果使用系统标准库,要使用来包含头文件;...
  • Setul
  • Setul
  • 2016年12月31日 13:36
  • 1162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++新手必问之头文件
举报原因:
原因补充:

(最多只允许输入30个字)