关于c++头文件

来源:互联网 发布:java 时间格式中间带t 编辑:程序博客网 时间:2024/05/16 07:17

在群里看到这么一行代码:#include "iosteam.h"

 

    开始我很吃惊,这人太有才了,佩服撒,居然想到用引号来写系统文件?干吗不用尖括号呢?当然了,这样子写,编译器不会有任何警告,也不会告诉我们这样子是错的,表面上看上去还真是没影响,其实不是的,下面说下这两种写法的一点点区别,希望对初学者有点帮助,从开始养成好习惯对以后会有很大的帮助的。

 

    #include 后的文件名用尖括号(<>)括起来,说明这个头文件是系统提供的,编译程序时,编译器会直接到系统目录下去查找该头文件并加载之。

    #include 后的文件名用引号("")引起来,一般用于自定义头文件,当编译程序时,编译器会先到当前工程目录下去寻找该文件,如果找不到会再到系统目录下去寻找。如:我们采用多文件结构定义一个类的时候,类的声明写在:类名.h中,;类的实现写在类名.cpp中,我们需要在类名.cpp中加上头文件"类名.h";

 

   另外,在标准c++中头文件是不带后缀.h的:

即:#include <iostream.h>应该写为#include <iostream>,也许有人会问,如果这样子写,不能在程序中直接使用cout/cin等,的确,因为采用#include <iostream>要包含命名空间std才能直接使用cout/cin,否则就要在该头文件中定义的函数/变量前加上std::来表示调用函数/变量的来源...

  

   还有一点,大家会发现好多头文件是以字母c开头的,如:cmath,cstdio,cstring等,因为这些是继承的c的头文件,用来区分c++自己的头文件,c++中可以使用#include <math.h>来直接使用c的头文件,但是不赞成使用该方法,建议使用#include <cmath>.....

 

 

[结果]

 

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

 

    现在来看看下面两个include:

 

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

 

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

 

 

 

    更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的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.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++标准程序库》。


原创粉丝点击