00:00
同学们,我们按照以前的老规矩呢,给大家讲解一下头文件的注意事项和细节,这点非常重要,如果你不了解他的注意事项和细节,你在使用头文件的时候呢,你感觉抓不住这个技术,不是这错就是那错,认真听一下。我总结了这么几点,大家认真听。引用头文件相当于复制头文件的内容,怎么理解这句话呢?你看我给给大家举个例子,大家看我这里不是include的一个my function头文件吗?如果我把这个去掉,是不是一去掉下面就报错呀?是不是他报错,但是你们有没有发现,如果我们把这个头文件的内容把它拷贝过来,他仍然不报错了。是不是又又对了呀,就相当于什么理解呢,相当于你把这一个头文件的内容拷贝过来一样。理解这句话了?好,接着我们看第二个细节。这第一个细节咱们就说完了。
01:00
第二个细节呢?源文件的名字可以。不和投文件一样,但是为了好管理,一般头文件和原文件名保持一样,这就是前面老师讲的这个细节,就是这块。就是这个my function的H和my my function c,这个两个名字可以相同,也可以不相同,但是为了好管理呢,咱们一般原文件名字相同,你看我举个例子,打个比方,同学们。写一个,比如说我把这个my function名字换了,把myc换成另外一个名字。假如说我换成一个麦。是不是换了呀,换了过后你发现我在这地方运行的时候呢,仍然不会有任何的错误,大家看。跑起来。大家看是不是没有任何错呀,一样的对不对,我把这个名字换一下看,大家体验一下啊,比如说我把它改成乘法。看看这个时候结果是不是也发生变化了,而且不会报错。
02:01
是变500了正确的,所以说呢,这两个名字其实是可以不一样的。但是我在这也说了,为了方便我们管理和维护,尽量跟他一样,为什么呢?这样别人一看,哦,这是一组吗?第三点,C语言中的include,大家有没有发现它有这种间括号,也有这种双引号,那么这两种引入方式或者叫包含方式有什么区别吗?是有区别的,注意看。注意听,如果我们使用的是include这一段监括号,它表示的是引用的是编译器的内库路径里面的头文件用于用于引用系统头文件。这句话就记住一句话,就说这个监括号它引用的是系统的头文件,你把这个记住就可以了。这就是为什么你们有没有发现,当我在这去引这个文件的时候,大家看注意听你看我,我如果这样引include打一个尖括号,你会发现这里面看不到这个脉。
03:07
我们写的这个MY方式没有。因为这个监括号就意味着我是引入的系统头文件,你是找不到的,但是大家看我打一个冒号啊,双引号,它就会提示my function。这是为什么呢?就是刚才老师说的这个细节。就是监括号默认引用的是系统的文件。而include这个双引号呢?引用的是你程序目录相对路径中的头文件及自己写的文件。如果在程序目录中没有找到引用的头文件,则到编译器的内库目录下去找。用于呃内库去找该头文件,用于引入用户头文件。那这句话什么意思,就说这个功能include,这个这个这个双引号这种方式呢,它是先到你的,它是先到你的程序目录下面去找。
04:05
在你的目录下面找不到,找不到的时候,他就到编译器的内库目录下去找,那我问大家一个问题。我问大家一个问题,那。这个间括号。监控这种方式呢,只能引入系统文件,而这种双引号的方式呢,既可以引入我们自己的头文件,也可以引入系统头文,也就是说你这样写也是可以的看啊。打个比方,我们在这写一个双引号。你会发现下面代码也没有报错。是不是没有报错啊,也就是说呃嗯,也也也就是说我我这写啊,其实这已经写清楚了,大家看啊。也就是说这样子的,你理解这句话就行了,所以引用系统头文件呢,引用系统的头文件两种方式都可以,都会可以的。
05:03
就是你系统文件,你既可用双引号,也可以用尖括号。但是这种include监控效率较高,为什么呢?因为它直接就到我们的。直接就到编译器的内库目录下面去找了,当然这个就很方便,而引入这个头文件用户自己写的呢,只能用include这个双引号的方式。明白这个意思了吧,那你看我给他举个例子,你看这我用这个没问题,但是你看这用它它就不好使。为什么呀?为什么不好使,因为这种监括号的方式,它直接就在我们系统下面去找结果,在这个编译器的内内路径去找,结果找不到,直接给你报错了,而这种方式呢。这种方式它是先到我们用户的目录下面去找,一找就找到了,找不到他再到系统下面去找。
06:01
系统下面肯定也没有嘛。所以说大家就记住最后一个细节就行了,记住什么呢?就记住老师总结总结的这样一句话。这这其实就是两点哈。第一点。就是老师总结的这一点。和哪一点呢,和这一点。把这个记住就可以了。好,这个听起来有点啰嗦,再再强调一下,因为这块呢,面试的时候或者笔试的时候经常会搞,就是引用系统的头文件。引用系统文件呢,这两种方,这种方式和这种方式都可以。但是呢,推荐使用下面这种原因是效率较高,因为他直接就到系统下面去找了。如果引入的是头用户的头文件。如果我们是引入自己写的一个投文件,只能使用双引号,而不能使用这个,为什么不能使用这个呀?因为这种方式它只会到编译器指定的那个目录去找,不会在你当前目录找,你当在系统下没没有写这个,当然就找不到了,不错了。
07:03
好,关于这个细节就讲到这儿,紧接着我们再看第四一个细节,认真听。那么这个include命令呢?一个include命令只能包含一个头文件,如果要引入多个头文件,需需要使用多个include,比如说同学们看这里。你看这里,我们这种方式赢的是一个标准。标准库的一个头文件,这种方式信是引入我们自己的头文件,这个文件就是所谓的用户头文件。用户投文件理解了哈,就说你一个骷髅的,你不能这样写,说老师我把这个放在一起,这个不行,这样他就不识别了。因此呢,一个include,一个include的指令只能去引入一个头文件,这个我说清楚了,第五点,同一个投文键,如果多次引入,多次引入的效果。多次引入的效果大家看这里,多次引入的效果和一次引入效果相同,因为头文件在代码层面上有防止重复引入的机制。我给大家举个例子。
08:08
比如说同学们看,我把这个再复制一份。没有问题,他不管你复制多少分都OK。你看复制三份,复制四份,复制五份,你看我运行也不会有任何问题啊,为了看到区别呢,我把这个改成加号。因为我只有改代码才能发现他到底是不是真的管用了。你看我改,改完了过后,代码不不会报错,仍然正常的运行,也就是说你这地方多次引入这个投文键不会有问题,但当然你你也不要吃饱了没事干是吧,你非得赢那么多次,赢一次就可以了。那么为什么不会不会报错呢?是因为我们这个代码层面,它自己有一个防止重复引入的机制。这是系统帮我们提供的,所以大家不用担心。第六点,在一个被包含的C文件中,又可以包含另外一个头文件,也就是说大家看这里,你看这里my function c my function h,这个这这个头文件是不是在这儿引入的这个这个头文件,其实它还可以引入其他的头文件。
09:15
你看在在这个my function里面,是不是我们又引入这个头文件了,换言之就是这个头文件引入是可以嵌套的。你比如说说老师,那我在这,呃嗯,你看我这说的就是一个被包含的点C文件,还可以包含另外的头文件,这是肯定的,知道吧,所以大家知道就是头文件也是一样的,你看我在这里。我在这地方,我在include,我随便写一个啊,Include。Include std IO。没问题。对吧,没有问题。看这样引入他也不会报错,你看这地方你是不是引已经引了一一次这个SDDIO,在你引入的这个头文件里面,你又引了一个SD Di IO,它不会报错,而且可以正常运行。
10:02
而且当然不要故意这样写哈,你看我把这个改一下,我又把它改成一个减法。你看我跑起来看看代码有没有问题。这次呢,应该返回一个负40。没有任何问题。说这是可以的,明白好,紧接着我们看第七个,不管是标准头文件还是自定义的头文件,都只能包含变量和函数的声明,这点特别的重要,只能包含它的声明,不能够包含其定义。不能包含定义,否则会在多次引入时出现重复定义的错误,这点是特别重要的,尤其是初学者经常犯错误。那我给他举个例子,大家看,假如说我在这个投文件里面,你看这是声明,但是呢,这是我犯了错误了,我这样写,我写个C。Say hello。这个地方我直接干什么呢?我直接在这里面写了一个函数。叫做C哈,注意这个地方就是定义函数了,不是声明了。
11:04
这个是这个是不是你定义了一个函数啊,为什么,因为你有函数体了。而不是简单生命。如果是生命的话,其实只有一个函数的签名而已,就是没有函数体。那这样子说做的话呢,你看会有什么风险呢,会有这样一个风险,大家看。假如我在这里去用这个C哈。先问同学们现在会不会报错,不会报错,因为为什么呢?因为你在引入这个my function.c的时候,相当于你把这句话。是不是复制过来了?是不负在,所以说你这样引入呢,你用这个c hello本身是OK的,你看我运行一下。肯定会输出那个嘻哈。而且代码也是正确的,是不是输出c hello了呀,看这里是不是输出了C哈,但是问题在什么地方呢?因为你这个地方是定义,所以说如果我重复引入这个my bank的话呢,就麻烦了。
12:01
你看我这样再赢一次。再引一次的话,同学们看,这次我来运行就会麻烦了。你看他会报一个错。报了一个什么错呢,我们来看一下,他说他说看到没有。你看这边他跟你提说很重很很重要,他说my bunker is中参见一个MY,呃,Say hello,他说这个已经有主体了。说明什么呀,说明你在这个哈h.H文件里面,你是定义了一个函数,而不是声明。因为因为你想一想,如果你这样写的话,就意味着你把这一个定义在相当于哈,我只能说相当于在这个H文件里面,你两次相当于你写了一次,这个再写了一次。函数就重名了吗?对不对,所以说同学们记住这个细节什么呢?就是说在我们这个被引入的这个H文件中,这个头文件中不要有定义,你可以写声明是没问题的,比如说你这样写是可以的。
13:02
你看我复制一下,说老师我在这儿呢,只写一个声明。执行一个声明,然后呢,我把这个定义,我把这一个say hello的定义写到这里面去。然后呢,我在这个地方去用,我写两次my function可不可以这样就没问题,因为这个时候你只是在头文件里面做了个声明,而不是定义,这样就不会报重复定义的问题,你看我给大家生成一下解决方案。大家看有没有问题。没有任何问题吧,你看一切OK。一切OK,那运行肯定也不会报错了,是不是c c hello。好,各位,这就是我们关于头文件的注意事项,那现在呢,老师花一点时间把刚才讲的这一个头文件的内容给大家做一个简单的梳理,来跟上老师的思路。那么关于头文件我们讲了哪些内容呢?跟着老师思路啊,来走一个。走一个我们刚才讲的头文件,内容呢比较多,我们慢慢梳理,首先呢,我们先根据以前讲课的一个规则,提出了一个需求。
14:09
然后就引出了头文件的基本概念,是这样子吧,同学们,我们先提出了一个需求。然后呢,再提出头文件的基本概念没有问题,而在这里我们有什么呢?有这么几个,几个点啊,几句话。给大家拿过来,我们说了头文件的基本概念是这样子的,它是一个扩展名为点H的文件。里面呢,包含的是C函数的声明和宏定义,宏定义是可以写到这的啊,我们可以,但是函数的声明写到这儿的。那么它被多个源文件引用共享。好,然后呢,在程序中使用头文件需要引入。的时候用include。好,这就是他的一个基本价值,下面还有一句话啊,我我就不再去多说。
15:02
把这个需求说完了过后呢,这边还有两个概念,我也一定把它啊,还有两句话一并拿过来。这两句话说的是什么东西呢?好,这里的话呢,诶这个地方应该是。上面include是一个意思啊,放这。上面这个是include,叫文件包含指令,好,这样我就不再多说了。这边建议把所有常量和系统变量和函数的原型写在头文件中,对不对,所以这个呢,是写在头文件的时候,我们要去去注意这个细节。需要注注意这个细节,然后呢,在需要的时候咱们引入这个头文件就可以了,紧接着咱们继续往下说明,下面呢,我们为了让同学们理解是不是画了一个头文件的工作原理图,这个是蛮重要的。那这个示意图呢,我把它拿过来。
16:01
整体。截取一下,放到我们的笔记中去,能看清楚哈,这个图还是比较重要,有指导意义,把这个图看完了过后呢,是不是我们就举了一个案例,就是文头文件的快速入门案例,写到这里来。那头文件的快速入门案例,我们是说了一点什么呢?说了这么一个东西。对,说了这么一个具体的需求。需求完了过后,这有个示意图啊,这是大大致是怎么用的是吧,这个示意图我也给大家拿过来,这个地方看的比较清晰,因为是图解,你看这边是。呃,那干脆这样子,我们不不从这解,我们从这边解好吧。我写到这儿,代码写到这,那我开始写截图了,截取我们的代码。首先我们写的是一个叫做my function.h的一个头文件,这个头文件我们是怎么写的呢?是放在这个位置的,大家看清楚,放在这个头文件文件夹下面的啊,一般我们会统一的放在这个。
17:04
目录下边。所以说这是它的一个是一个部分。这个说完了以后,是不是我们写了一个my function.c啊。MY这里面呢,定义了头文件所声明的那些函数。好,这块我们也拿到这边来。紧接着是不是我们写了一个hello.c来使用?好的点C来使用在哪里呢?在这是不是我们是这样用的。是这样的,好,同学们,那关于头文件的快速入门我们就讲到这,最后为了加强大家对头文件的理解,我们讲了一下投文件的注意事项和细节,那一共整理了有七点,有七点我给大家拿过来梳理。好,这是前面的几点,第一点。对,这前面两。呃,我们我们这就这就这三点哈,就这三点。
18:02
梳理到这儿,那下面这一块的内容呢,就是对它的一个解释。就是最后我这里有个小结论,小结论是什么呢?就是这样的,引用系统图文件两种形式都可以,但是推荐使用include监控。引入头用户的头文件呢,咱们用这种两个双引号对不对,这这只能用它了啊,只能用这一种形式了。为什么?前面已经说的很清楚了,这是细节的一部分,紧接着呢,后面还有几个小细节,我也给大家拿拿过来。对,同样我们给他编个号吧。好,这边呢。哦,这边有一个问题,这边他。变成一个初期了。好,变成个粗体。放这儿吧。好,这边我给他编个号。来一个编号,好,现在呢,我们一共总整结了有七点七点有些有些地方我是给大家举例说明的,比如说一边讲呢,一边再举例,好各位同学那关于头文件的这个比较棘手的问题,或者相对比较复杂一点的。
19:11
这么一个内容就给大家讲解到,讲解到这里,大家呢,需要好好的去领领会一下,最好啊同学们,呃,建议同学们呢,也像老师那样写一次,比如说你写一个呃,点C文件,再写一个头文件,把它引进去。把这个图形引进去,然后你用一用,体会一下,这样呢,你的印象就会更深刻。各位,头文件的内容就给大家讲解到这里。
我来说两句