C语言头文件的使用

C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐认识清楚他的本来面目。揪其原因,我的驽钝和好学而不求甚解固然是原因之一,香港服务器,但另外还有其他原因。原因一:对于较小的项目,其作用不易被充分开发,换句话说就是即使不知道他的详细使用方法,项目照样进行,程序在计算机上照样跑。原因二:现在的各种C语言书籍都是只对C语言的语法进行详细的不能再详细的说明,但对于整个程序的文件组织构架却只字不提,找了好几本比较著名的C语言著作,却没有一个把.h文件的用法写的比较透彻的。下面我就斗胆提笔,来按照我对.h的认识思路,向大家介绍一下。

让我们的思绪乘着时间机器回到大学一年级。C原来老师正在讲台上讲着我们的第一个C语言程序: Hello world!

文件名First.c

main(){printf(“Hello world!”);}

例程-1

看看上面的程序,没有.h文件。是的,就是没有,世界上的万物都是经历从没有到有的过程的,我们对.h的认识,我想也需要从这个步骤开始。这时确实不需要.h文件,服务器空间,因为这个程序太简单了,根本就不需要。那么如何才能需要呢?让我们把这个程序变得稍微复杂些,请看下面这个,

文件名First.c

printStr(){printf(“Hello world!”);}main(){printStr();}

例程-2

还是没有,那就让我们把这个程序再稍微改动一下.

文件名First.c

main(){printStr()}printStr(){printf(“Hello world!”);}

例程-3

等等,不就是改变了个顺序嘛,但结果确是十分不同的.让我们编译一下例程-2

和例程-3,你会发现例程-3是编译不过的.这时需要我们来认识一下另一个C语言中的概念:作用域.

我们在这里只讲述与.h文件相关的顶层作用域,顶层作用域就是从声明点延伸到源程序文本结束,就printStr()这个函数来说,他没有单独的声明,只有定义,那么就从他定义的行开始,到first.c文件结束,也就是说,在在例程-2的main()函数的引用点上,已经是他的作用域.例程-3的main()函数的引用点上,还不是他的作用域,所以会编译出错.这种情况怎么办呢?有两种方法,一个就是让我们回到例程-2,顺序对我们来说没什么,谁先谁后不一样呢,只要能编译通过,程序能运行,就让main()文件总是放到最后吧.那就让我们来看另一个例程,让我们看看这个方法是不是在任何时候都会起作用.

文件名First.c

play2(){play1()}play1(){play2() }main(){play1()}

例程-4

也许大部分都会看出来了,这就是经常用到的一种算法,函数嵌套,那么让我们看看, play1和play2这两个函数哪个放到前面呢?

这时就需要我们来使用第二种方法,使用声明.

文件名First.c

play1();play2();play2();{play1()}play1(){play2())}main(){play1()}

例程-4

经历了我的半天的唠叨,加上四个例程的说明,我们终于开始了用量变引起的质变,这篇文章的主题.h文件快要出现了。

一个大型的软件项目,可能有几千个,上万个play,而不只是play1,play2这么简单,这样就可能有N个类似play1(); play2();这样的声明,这个时候就需要我们想办法把这样的play1(); play2();也另行管理,而不是把他放在.c文件中,于是.h文件出现了.

文件名First.h

play1();play2();

文件名First.C

#include “first.h”play2(){play1()}play1(){play2()}main(){play1()}

例程-4

各位有可能会说,这位janders大虾也太罗嗦了,上面这些我也知道,你还讲了这么半天,请原谅,如果说上面的内容80%的人都知道的话,那么我保证,下面的内容,80%的人都不完全知道.而且这也是我讲述一件事的一贯作风,我总是想把一个东西说明白,让那些刚刚接触C的人也一样明白.

上面是.h文件的最基本的功能,那么.h文件还有什么别的功能呢?让我来描述一下我手头的一个项目吧.

这个项目已经做了有10年以上了,具体多少年我们部门的人谁都说不太准确,况且时间并不是最主要的,不再详查了。是一个通讯设备的前台软件,源文件大小共51.6M,大小共1601个文件,编译后大约10M,其庞大可想而知,在这里充斥着错综复杂的调用关系,如在second.c中还有一个函数需要调用first.c文件中的play1函数,如何实现呢?

Sencond.h文件

play1();

sencond.c文件

***(){play1();}

例程-5

在sencond.h文件内声明play1函数,怎么能调用到first.c文件中的哪个play1函数中呢?是不是搞错了,没有搞错,这里涉及到c语言的另一个特性:存储类说明符.

C语言的存储类说明符有以下几个,我来列表说明一下

说明符用法

Auto  只在块内变量声明中被允许,表示变量具有本地生存期.

Extern  出现在顶层或块的外部变量函数与变量声明中,表示声明的对象

可以有一个人陪着你,也可以你一个人,总之那一刻,

C语言头文件的使用

相关文章:

你感兴趣的文章:

标签云: