00:00
下面我们来看一下和函数有密切关系的一个概念,叫头文件。投文件,那同学们还记不记得我们在前面学习的过程中,我们经常使用到这个include什么什么什么点H这一个。就是头文件。那么这个头文件跟我们的函数有很大的关系,就有很多联系,我们来说一下头文件这个事情。那为什么需要投文件呢?还是先看一个需求,还是先看一个需求。在实际的开发中,我们往往需要在不同的文件中。去调用其他文件定义的函数是不是这样子的,因为你看啊,同学们看,我们举举这个例子,你看我在这里面就写了一个函数,这个是不是一个函数啊,但是大家想一想。我们在实际的一个开发中,是不是这样的函数很多很多,你总不能,你总你总不可能说,诶只要我需要一个函数,我就拼命的在这写就行了,这是第一个,我又写另外一个开二。
01:07
然后呢,我还有函数,好,我再取一个别的名字开三完了,那你不停的写下去,那你这个文件就就变得巨大无比了,是不是这样的道理肯定不现实,因此现在我们涉及到一个什么问题呢?同学们,现在呢,我们就涉及到这样一个问题。诶,我把这个先先撤回去,我们现在涉及到这样一个问题,就是我们。需要去调用其他文件定义的函数。比如说我有一个叫hello c的这么一个文件,我想去调用MY放C中的函数怎么办?再说的形象一点,比如说我这有个文件。叫hello,注意听我的意思啊,这有个hello c,那这边呢,对这边有个my function,我简写my function c,这里面定义了一个函数,但是这个函数呢,就这个函数啊,我希望能够在这用,就是我希望把它引进来。
02:06
使用这个my function里面的函数,我怎么办呢?这里就涉及到一个头文件的概念。那么我们来看看头文件到底是做什么事情的。头文件的扩展名是点H,这个不说了,包含了C函数声明和宏定义,被多个源文件中引用和共享。在两有两种类型的图文件,一种是我们程序员自己写的图文件,还有一种就是C标准库自带的图文件。这个我就不讲了哈,就是说自己写的文件,待会我们会写一份标准库自带的图文件是哪些呢?比如说同学们看到的这些。你看。在这里面。这个是不是就是一个。标准C,标准库里面提供的一个头文件,再比如说这里L no.H这也是标准库提供的一个头文件。
03:02
那这个头文件里面有很有什么东西呢,它就有函数。第二点,在函数中,在程序中要使用头文件,我们需要使用一个叫做C预处理指令include来解决。也就是说这个include它有个专业的术语叫做什么呢?预处理指令,前面我们已经看过的,像SDDIO就这个图文件,它就是C标准库的。还有一点呢,Include叫做文件,包含命令,用来引入对应的头文件。include也是C语言预处理的一种,就是刚才所说的。那现在呢?还继续来说,Include的处理的过程很简单,就是将头文件的内容插入到该命令所在的位置。从而,从而把头文件和当前文件、原文件连成一个文件。类似于复制粘贴的效果。复制,但是呢,我们不会直接把原文件复制在同一件中,为什么呢?因为这样很容易出错,而且呢,代码冗余容量很大。
04:07
还有一点呢,我们要建议各位同学把所有的常量宏,还有系统的全局变量,还有函数的原型写在头文件中,需要的时候我们引入就可以了。那有些同学说,老师你这样讲我完全听不懂,什么意思。那各位同学不着急,我给你们看一个我画的原理图,大家就一目了然了,你看这个工作原理图是不是就一目了然了呀?比如说我这里有个hello c点源文件。比如说再说一遍啊,这有个hello c点文件,那么在这个my function c也有原件,比如说我这边有定义的函,定义的函数,比如说啊,比如说开了。一个函数,比如在在定了一个叫做c hello。这函数我简写的同学们。这假设我在这个my function里面定义了两个函数,那么这两个函数我希望在哪里用呢?在hello c里面用,你看我怎么办呢?好,我首先呢,写一个my my function h这个头文件,在这里我声明我声明一下,开了。
05:11
还有一个呢c hello。看清楚了,我声明,声明就是说只有函数的这个签名,或者叫函数的函数函,就是这个函数的一个声明,没有函数体。待会大家就会看到,然后我要用怎么办呢?大家看这里,我很简单,一句话就可以搞定了。大家看我在这里呢。这样写,我给大家重新写一下。现在我想去使用my function c里面的这两个函数,我只需要用一个include指令。我include什么呢?MY放点H。就可以了。这个叫引入。引入。引入什么呢?我们的头文件。投文件能理解了,那一旦引入这个头文件,我的作用是什么呢?第一个可以使用。
06:06
可以使用头文件中。头文件中声明的。声明的函数了。这样好处是什么呢?便于便于管理。便于管理和维护,说老师我没有感觉到啊,你像这样子看我这样include就有点感有有种什么感觉呢?你可以你可以这样类似的理解,就好像哈,我们把这个东西引到这边去了。但是我说的是这种感觉哈,就是相当于说你把这个文件引出去了。诶,我们换一个颜色。就好像我们把这段代码呢,相当于说把这个头文件。拷贝到把这个图文件对应的函数拷贝到我们这个hello c里面去了,当然就很容易使用,那还有一个好处是什么呢?比如说我这里还有一个另外一个原文件,比如说这个文件是叫做ABC文件,在这个ABC,呃,这样写另外一个名字吧,比如说叫做do,随便写啊,do.c在这里面我也想,我也我也想去使用my function.c里面的这两个函数,我怎么做呢?我也include就行了。
07:20
那有相当于什么呢?诶又相当于说把这个头文件引入到这里面去了。诶,同学们想一想,是不是就意味着我这个do.c也可以去使用my function里面的这点看数了。简不简单?还有一个好处,大家发现什么呢?我们将来如果想对这一个计算函数进行一个扩展。进行一个扩展,比如说我们原先只处理了加减乘除,诶我想加一个功能,加一个什么,加一个模,取模的计算是不是很简单,我只需要在这里。
08:00
在这个my function.c里面把这个。开了函数进行一个升级或者改写,那么这边和这边都可以去使用一个新的功能,是不是也利于我们的维护啊。很方便的,很方便,还有一点我要说明同学们,就是MY这两个文件的名字啊,它的这个名字呢,一般可以不相同,再说一遍。哦,我这里做点说明。说明什么呢?说明就是my function.h。和。和my function.c。点C。的文件名,文件名不呃是文件名可以可以不相同。不相同。什么叫可以不相同呢?比如说你这个叫,你这么叫my function这个面取个名字叫做MY也是可以的。
09:02
明白这意思吧,可以不相同,但是建议啊,但是我们建议建议从规范性来说,从规范。规范来讲来讲。来说啊来说从规范来讲,建议一样。啊,从规范性来说最好一样。最好一样,这样呢,我们就一目了然了,别人一看,哦,你在哦,这两个是一组。因为你将来可能还会有别的呀,说老师,那我将来可不可以有这样一个呢,比如说我这又有一个头文件叫做什么呢?呃,打个比方吧,比如叫tool。Tool h这里面呢,我又声明了很多的函数,比如说有个F1啊,打个比方,我还有一个F2。F。对不对,然后呢,这边我又这是头文件吗?然后呢,我又再写一个跟它对应的这个点C这个原文件。C文件叫源文件。
10:02
OK,诶,这个写原,这个写原文件。那这个时候呢,我在这里就定义或叫实现好定义这个,那这样的我就我的好处是我将来一看我我就知道这是一组。然后呢,如果说我在这一个do c里面,我还想去使用tool c里面的F1和F2这两个函数,那我怎么办呢?诶,我也变得非常简单,我可以include。Include什么玩意儿呢?点H就可以了,所以说你看这个多方便呢,那相当于说我们在这里,在这个MYDOG里边,OK,在这个MYDOG里边。我们又引入了一个图文件。是不是这样理解啊,诶这样就理解到位了,那这样就很方便了嘛,你将来你将来可以找一个专门写这个头文件的,我们拿来用就可以了,这变得非常简单,好,同学们,这就是我们的工作原理,大家听懂了吗?
11:04
那这样子光有这个原理,没有实践也是不行的,所以说老师呢,再给大家举一个头文件的快速入门,我们就用投文件的方式来改写前面的这个计算任务好不好?好,那现在呢,我们来玩一把,现在呢我们又来一个头文件的快速入门,头文件呢可以实现C相互调用函数,那我的思路就跟刚才同学们看的这一个工作原理图,给它进行一个对照,那同学们打开我们的VS2010,我现在开始玩了。首先念,我先写一个头文件。没有问题吧,同学们跟着我的思路,我先写一个头文件,这个头文件呢,我们取个名字叫做麦放。就一样哈。好的买方在这里面呢,我们声明一下,在里面我们声明。声明函数,比如说这个函数呢,我们有一个函数叫做写一个哈,呃,叫做,刚才不是有一个名字了吗?叫。
12:07
叫int。Int,然后呢,开了,但是有一个问题同学们,因为我我们在这里呢,已经有一个函数了,名字叫它,所以说我准备我准备怎么样换一个名字,因为他这已经有个名字叫开了了,你再取一个名字叫也叫开了,那么重复了吗?那怎么办呢?我取一个新的名字好不好,叫做麦开了没问题吧。因为我我再取相同名字,这不重复了吗?明白我的意思吧,声明一样的,好的,我写个N1。Int n2是不是还有个opera啊,同学们。OP。好,这个就写完了。这个声明后面可以带一个分号啊,也可以不带,我们先可以不写它保存。这就生命的一个函数,那这个函数生命完了,是不是根据刚才讲解函数真正的定义可以写在my function c里面去,能理解吧?好,我把这个呢写到这里,这是我的思路。
13:05
好,同样这也写个C文件。MY。放。OK。我把这个后缀呢改一下跟C。改成C呢,我在这里面去实现。实现什么呢?OK,实现这一个MY放里面的这个函数。因为你这边只是一个声明,没有实现。那现在这个实现方案特别的简单,我们拿过来用一下就可以了。实现的方案是不在前面我们已经写过一份了,我就不再多说哈,我把这段代码拿过来复制一下。看清楚了,我把这段代码复制到我的Mac里面去。好,这就写完了。看到没有,这个就是我们在这里面实现了买开了。这个东西迈开了,这个东西我们就实现起来了,实现起来过后,大家看这面有个问题,他说print f没有定义,是因为你在这没有升,没有去做这个工作,好,现在呢,我include。
14:08
Include什么呢?走起来,ST。L。是不是?好,这就写完了。是不是也写完了,写完过后相当于说此时此刻我们把这个C和头文件写好了。那现在呢,我们再写一个hello c来用它。来,走起来,同学们。好,我先洗个hello say。OK hello。C文件,我们要用它。那现在呢,同样我们把后缀改一下。好的,现在呢,我们写一个主函数。在这里呢,我希望去使用。使用什么呢?我希望去使用MY开了完成计算任务。好的,你看我怎么用哈,你看我怎么用,首先我把该引入的这个还是要引进去的,Increase TD,好,这个我们还是要引入,因为待会有输出嘛,那我现在怎么用呢?我简单一点啊,我写一个。
15:07
N1。等于。10TN2等于50,好,再来一个opera吧。就是我们操作符oper来整一个什么呢?整一个加法。好的,现在有了这过后呢,还有一个结果是不是大不啊RS等于随便我说去话0.0,那么我搜一下,现在我开始要掉了啊,我调这个myc里边的这一个麦开。来走起来,然后呢,我把这个传进去,传进去传什么呢?传一个N1。传一个N1,再传一个N2,再传一个oper。没有题,同学们注意听,然后呢,我们这个R接收一下。大家有没有发现报错了?他说啊,你好,我们发现麦开了没有定义。
16:03
为什么没有定义,是不是我们还是还差了一步,是不是说我们要在里面用,是不是要引入这个头文件呢?你不引头文件,他不知道你生病过呀,所以说这个。肯定要报错,引入的话呢,就这样引入。引入我们需要的头文件,理解了吗?来走一个include走起来,那这个时候呢,我们需要用双引号。他已经提示你,他说这边有个麦棒一可以有,它会提示你好写进去代码就报错了,看这是不是就没有错了。那么我们看看到底能不能用起来呢?OK啊,那同学们,我们自己这样子,RS等于。第22F。同学们,我把这个二打出来好不好,为了好看呢,这边换一行。那同学们现在我们就开始运行了,看看到底这个管不管用,这边就是调用我们的函数。调用给调用哪个里面呢?My my function.c。
17:05
中定义的函数。哪一个呢,麦开了。同学们,现在我们来运行一下,看看OK还是不OK好不好,我们先把前面的不用的先注销一下。好,我先把这个注销了。那现在呢,我们现在留的是一个hello.c,一个是my function c啊这个这个my function c不能不能注销。这个注销了就没有了。这边是不是注销,哎,对对,把这个注销一下,诶这个要注销一下。对,这个要注意消息。现在我们留下的是哪几个号,同学们看一下,一个是hello c,一个是头文件。大家看这个头文件,你看他也不报错啊,然后这边呢,还有一个就是MY方C,就三个文件,现在我们来运行一下,看看是否OK。那如果是正确的话呢,这边会提示一个结果,而且也会在这个函数里面输出一句话是不是。
18:04
那基本。在这个函数里面,它会执行哪句话呢?大家看一下是不是在这个里面,它在这执行过程中还把这句话也说出来了。理解了吗?这句话,因为你分到F嘛,他肯定会输,也就说这边会输出,首先会在里面输出话,最后呢,RS还会得到一个输出结果走起来。运行。好,运行过后我们看效果,诶大家看这边有个错误,我们看错误在哪里产生的哈。OK。大家看,呃,在这里面它提示了一点错误。他提示的错误,他说这个N1N2已经重复定义了,看是在哪里重复定义的,我们找一下哈,我们来找一找,看看问题在什么地方。我们看下问题在什么地方。我们这样子,我们先生成一下解决方案,看是不是真的有问题啊。我们生成一下。他都是有个失败,我们看失败的原因在哪里。
19:00
失败的原因在哪里找一下?OK,他说。他说命不在行,参中N1和N2重复定义了,那这个原因是怎么导致的呢?我们来看一看。这边代码应该是没问题的,Hello c,我们引进去也没问题。我们再来看这个头文件哦,大家看这一个头文件,这地方呢,我们需要打一个分号。因为你在生命的时候,生命这个函数的时候,你必须有个分号来表示,这是一个函数的声明。否则就要出问题,好,所以说我们的问题应该是在这里,那同学们,我们再次生成解决方案。这时呢,就不会再有任何问题了。各位同学请看,现在是全部成功,那现在成功过后呢,我们来运行一下,看看到底跟我们想象的结果是否一样,好吧,我们运行一下走起来。诶,这帮一闪而过,不行,Get。那各位同学我们运行一下。
20:00
跑起来。那这个时候我们拿到结果呢,应该跟以前是一样的,看在这里面输出了一个十加50等于60.0,最后返回结果是60.0正确,那你这方可以改值,比如说老师说老师我把这个改成减号可不可以,当然是可以的了,对,那么我们再运行。对,这个时候返回的就应该是十减去50等于这么多对不对,好同学们,那关于我们这一个什么呀,就是头文件的一个使用,就是怎么去通过include一个头文件来使用到某一个函数,这个知识点我们就说到这。这大家看看理解了吗?应该也不是很难,对不对,只要你把这个原理图搞清楚了,就一马平川。各位同学,关于我们的头文件的这个工作原理和快速入门就给大家讲解到这里。
我来说两句