您的位置:首页 > 编程语言 > C语言/C++

c语言头文件存在的合理性

2015-06-22 11:07 483 查看
我接触的第一种程序设计语言是c语言,然后是c++,再然后就是java以及各种脚本语言了。在学习c语言时由于只是浅浅地学了一下,并没有注意到一些细节,也就是想的比较少了,只知道how不知道why。后来,在接触了c++后,发现很多东西都得深入一番才行,在c++探索过程中,我注意到了c++和c一样有两种文件:头文件和源文件。我在想为啥将c++或c文件要划分为两种,不要头文件单单使用源文件就不行么?随着学习的深入,我渐渐开始懂得了头文件有利于减少重复性的工作,但那时还是觉得头文件不是个必需品。所以有时为了方便,我就用源文件去代替头文件即有这样的语句#include"xxx.c"。但是随着写的程序越来越复杂,我常常遇到一些错误,但是我有不知在哪里出错了,为了修正错误,我采取了最为笨重的方法,将整个程序写在一个源文件中去。后来,觉得问题必须解决才行了,于是找了一些c语言关于头文件的资料看看,才明白头文件也是个必需品来的。

要理解为啥头文件是个必需品,我认为先要对下面几点有一定的了解:

1、编译器的工作过程——预处理阶段、词法和语法分析阶段、编译阶段和链接阶段。特别是编译阶段和链接阶段。编译阶段主要的工作是将源文件编译成目标文件。而链接阶段主要工作是将各目标文件进行重定位,生成可执行文件。

2、头文件主要是用来干嘛的,源文件又是用来干嘛的。头文件,内含函数声明、宏定义、结构体定义等内容.c文件是程序文件,内含函数实现,变量定义等内容。

3、头文件的作用是:

1.如果在头文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编 译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此头文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定 义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错 

2.如果在头文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此 头文件的C文件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编译器就会将此变量放入DATA段,最终在连接阶段,会在DATA段中存在多个 相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空间,而不是多份空间,假定这个变量在头文件没有赋初值,编译器就会将之放入 BSS段,连接器会对BSS段的多个同名变量仅分配一个存储空间 

3.如果在C文件中声明宏,结构体,函数等,那么我要在另一个C文件中引用相 应的宏,结构体,就必须再做一次重复的工作,如果我改了一个C文件中的一个声明,那么又忘了改其它C文件中的声明,这不就出了大问题了,程序的逻辑就变成 了你不可想象的了,如果把这些公共的东东放在一个头文件中,想用它的C文件就只需要引用一个就OK了!!!这样岂不方便,要改某个声明的时候,只需要动一 下头文件就行了 

4.在头文件中声明结构体,函数等,当你需要将你的代码封装成一个库,让别人来用你的代码,你又不想公布源码,那么人家如何利 用你的库呢?也就是如何利用你的库中的各个函数呢??一种方法是公布源码,别人想怎么用就怎么用,另一种是提供头文件,别人从头文件中看你的函数原型,这 样人家才知道如何调用你写的函数,就如同你调用printf函数一样,里面的参数是怎样的??你是怎么知道的??还不是看人家的头文件中的相关声明 啊!!!当然这些东东都成了C标准,就算不看人家的头文件,你一样可以知道怎么使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: