00:01
我们来看一下宏定义在使用的时候需要注意的事项,还有它的细节。首先我们看第一个宏定义呢,是用红名来表示一个字符串,这点在前面咱们已经有一个体会了,在宏展开的时候呢,又以该字符串取代宏名。这只是一个简单的替换,注意啊,那因此字符串中可以含有任何字符,它可以是常数、表达式、if、语句、函数等等。预处理程序对他不做任何的检查,如果有错误,只能在编译中已编译已被宏展开的原程序才会发现。这句话怎么理解呢?就是同学们注意,假如这个红哈,这个红。它其实是,嗯,它只是做一个简单替换,所以说你这里面假设有if语句啊,什么这个函数啊,这些你都可以写,只是写完了过后呢,他替换的时候,他就严格的按照你后面写的这一部分的内容给你替换,把这个M替换成你写的内容。
01:09
所以说这句话的意思就是这个意思,明白我的意思吧,就是它只是个简单替换,因此它可以是这些东西。但是在预处理的时候,他并不检查。什么时候才会发现,假如你写错了,什么时候会检查出来这个错误呢?是在编译过后啊,编译已被宏展开的原程序的时候呢,由编译阶段来提示错误。明白这个意思吧。第二点,宏定义不是说明或者是语句,因此行末不需要加分号,如果你加上分号呢,连分号也一起会替换。打个比方,如果说你后面加了一个分号。假设你认为它是个加了分号,那我告诉大家,它红替换过后啊,它会怎么替换呢?他会把这个分号也一起写进去。
02:01
那当然这个语序就错了。明白我的意思吧,它会它红,展开过后它会变成这个样子。那显然这个结果你运行的时候,他肯定会报错。他肯定会报错,因为你你这个就说不过去什么意思了吗?因此我们的这一个宏定义呢,不要带分号,明白这个意思吧,除非你就是要带一个分号,那是那是你有意而为之。紧接着我们来看第三点,宏定义呢,必须写在函数的外边,就不能写在函数的里边哈,其作用域为宏定义命令起到原程序结束,如果要终止起作用域,也可以用on find命令来表示。打个比方,同学们看这段代码。这个代码我就给他家说一下,你们听一下就可以了哈,比如说我这里有一个红定D半派等于3.14159。那么在这下面呢,我可以一直使用,你看这里面写个派。
03:00
这个派呢,就是这个红。如果你在这写了一个on,这个就是什么呢?这个就代表取消。取消。诶,这个叫取消宏定义,那你一旦取消宏定义了,各位同学你下面。呃,你下面再去用这个派就错了。错误,这里不能再使用到派了,明白吧,因为你写了一个on派,如果你要在这个下面继续使用这个派,那你就不能有这个取消宏定义的这句话,明白了吗?这个同学们知道就行了哈,我就不去运行了,因为这个很简单,一说就知道了,所以说如果你这写了一个on派,那你下面又用到这个派这个红名了,那对不起,那么编译器直接你这个用的时候,它会指引你报错。好,这是第三点,第四点我们看一下代码中的红名,如果被引号包括了,那么预定义程序不会对其做红红替换。举个例子,同学们看这里哈。
04:02
这个案例你看这里我定一个方,OK 100。其实这是这个OK是个红名,但是如果你有一个输出语句print f里面你输了一个OK,但是这个OK呢,它被双引号引起来了。那么对不起,这样子,这个OK是不会被红替换的。这个OK不会被红替换,明白了吧,就是因为为什么呢?因为你你这个用双引号了,如果你你在外边写了,同学们,假如你这你在外边写了一个OK,打个比方哈,各位你这样写的,你说哎,老师我这里写了一个N,等于OK各位。那这样子的话呢,它在红展开的时候,这个OK会被替换成100明白了不,那里面那个因为你用双引号引起来了,那它就不会被红替换。好,关于第四点我们就说到这儿,第五点宏定义,它允许嵌套。允许嵌套在宏定义的字符串中,可以使用已经定义的红名,在宏展开的时候由预处理程序进行层层替换。
05:10
那么我举个例子,比方比方说同学们看这个案例,这些都比较简单,一说就知道了。这我定义了一个派,这是一个红派,是一个红名,对不对。这是个红名。那么如果我在下面又定义定了个S,这里面写了个派乘以Y,再乘以Y,因为这个派呢,已经是定义的红名了,所以说如果同学们看,如果你在下面写了一句话,叫做输出这个S。输出这个S,那么红替换过后这个S是什么呢?这个S就是3.1415926乘以Y,再乘以Y,也就是说。也也就是说你这个在预定义就是在预处理过后,在预处理过后,那么这句话展开过后就是红展开过后,其实它会变成这么一条语句。
06:07
他说老师为什么这个不是这个地方3.1451不是派。不是派乘以Y再乘以Y呢,因为看清楚了,你这个派本身就是红名,所以它在预预编译的时候,或者在预处理的时候,它会优先把这个派替换成3.145 3.1415926。然后再后再在这个城外,城外。明白这个意思哈,并不难。最后呢,第六点,习惯上我们的红名都是大写字母,以便于跟变量的区别,但是也允许小写,也就是说习惯上我们这个红名都会写成大写的字母,如果你非要写成这个,也可以说老师我偏偏不喜欢,我就喜欢写小写的字母,可不可以,也可以,但是呢,不规范。因此,我们建议同学们红名东右红名都用大写的字母表示就OK了,明白这个意思好,紧接着我们再看第七点,第七点是什么呢?
07:10
可以用宏定义表示数据类型,书写更方便。你比如说。我们呃,有一个这个on sand的int,这是无符号的整形对不对,如果说你你想简单一点,你说老师我红定一个我写个unit,然后呢,后面写个sign it,好,那你那你这样红定义过后呢,如果你在代码里面出现了。这个unit,这个ABC,那这个宏替换了,完了过后它会变成这样子的宏替换。红替换后。替换。红。替换。红金换过后这一段这一句话就变成什么了呢?变成了sand。Int到AB,明白这个意思哈,所以这样子呢,在有些情况下,我们代码可以显得更加的简洁。
08:04
这点请大家注意,我也不去运行了,因为非常简单,没有什么可说的,最后第八点说一下。那么宏定义表示数据类型,还有一个叫做DeFine f,呃,Type DeFine也可以定义数据类型的,说明这两者是有区别的,宏定义呢,只是简单的字符替换,由预处理来来来处理来由预处理器来处理的,但是第type def DeFine呢,是在编译阶段由编译器处理的,这两者是不一样的。这个type是用另外一个名称来表示一个数据类型一,所以说这有区别,区别在哪里?刚才已经说了,宏定义只是字符串的替换,是预处理器来处理的,而type地方呢,是在编译器的时候有编译器处理,这是最大的区别。好,这个呢我也不举例,大家知道就行了,好不好?好各位同学,那关于宏定义的细节呢,我们就给大家聊到这里,我们来把这些内容梳理一下。
09:02
我们讲到哪里了呢?来看一下红利的形式,这讲了我们梳理一下这边的内容。好,我们梳理一下这边的内容。这边我们已经梳理到哪块了,我们看一下。好,这是梳理到这儿,那么现在呢,我们把宏定义的细节给大家梳理一下,并不难哈,并不难,这些东西就一说都知道,没有什么难度,也没有什么太多的业务逻辑在里边。一听就明白了。我把这个呢给大家梳理一下。好的,这是这么一个。第一个。就前面三点,前面三点这有个案例,我给大家板书过来。同学们有兴趣的话呢,可以把这个案例运行一下。这个运行过后,这个结果呢,会跟老师说的一样。这是第三点,第四点,第四点这地方有一个就是如果红名被引号包围,就不会进行宏替换,就是预处理器呢,它会忽略预处理器它会忽略好,这是第四个。
10:08
第四一个案例,第五第六我们整体的也把它拿过来。第五一个,第六一个。OK,放过来哈。好,这是这是第五一个。好,第四一个案例呢,我先给大家板述过来,第四一个案例。第四一个案例就应该是他了。第四一个案例是他。第五一个案例我也给大家搬过来哈,第五一个案例也给大家拿过来,就是这个题。其实这些呢,就是老师一说就知道的,没有没有什么业务逻辑在里面,不需要大家大家就记记住就行了,或者知道就行。这是第六第七个,第七个呢,就是我们可以用宏定义表示数据类型,让我们的书写变得更加简单。
11:00
还有一个第八一个第八一个呢,就是告诉我们宏定义跟我们的type是有区别的。我写到这。宏定义宏定义数据类型。和我们的type定义数据类型的一个区别。哪个区别呢?简单说宏定义呢,是由预处理来处,预处理器来来完成的,而type地方是在编译阶段有编译器来处理的,这两者区别是非常明显的。这边还有一个案例,第七个还有一个案例,我也给大家板述过来。哪一个呢,就他。我们用宏定义可以来写一个数据类型,这样呢让书写更简洁。各位同学,那关于宏定义的注意事项跟细节,我们就给大家讲解到这里。
我来说两句