00:02
同学们,我们再来看一个关于带参数的宏定义。那么前面我们这个宏呢,其实都是比较简单的没有带参数,在实际的开发,或者是我们你在做题的过程中呢,我们还会遇到一种带参数的宏定义,我们来看一下什么是带参数的宏定义,先做一个基本介绍,C语言中允许宏带有参数。在宏定义中,参数我们称之为形式参数。在宏调用中的这个参数呢,我们称为实际参数,这一点跟函数非常的类似,但是不完全等价。OK,相似,但是不是完全相同的。对带参数的宏在展开的过程中不仅要进行字符串的替换,还要用时参去替换行参。这这一点大家待会儿呢,我们举例的时候还会说明。带参宏定义的形式是这样子的,红名,然后这边是行参列表,这边是字符串,看到没有?
01:05
也就是说在原先基础上多了一个什么呀,多了一个小括号里面有形参。在字符串中呢,可以含有各个行参,就字符串里边这个字符串里边可以有你这边写的行参的名称。那么代参宏调用的形式一般是什么呢?红名,然后传送去时参列表,那这样我说了过后大家可能不太明白,这样子我举个例子。我举个例子,大家一目而了然。好,同学们,现在呢,我们给大家举例说明一下,走一个。好,这边是代餐的红。好的,那现在呢,我们写这样一个东西哈,我们叫做parameter parameter就参数的意思范。代餐的一个宏定义。小心了。那跟张老师思路。都挺简单的,我们来看一下就可以了。
02:02
好,同学们看这段代码,我先做点注释哈,首先我们看这句话是什么意思,B max,那么这个呢,就是一个代餐的红,就是max,说明一下。对,说明第一点就是这个max呢,就是带参的宏带参数。带参数的宏。OK,那这边那哪哪个四道内容呢,大家看这边就是它的形参。就是AB,就是它形差。AB就是行参。行参,那么我们可以看到这个行参,就是同学们看到这个行参呢,会在它的字符串中出现,你看这个字符串行串啊,这边是它的什么呢?对应的字符串。是代餐的。代餐。带参数,带参数的宏的这个对应的宏对应的字符串。
03:04
该字符串中,该字符串中。可以有可以使用什么呢?可以可以使用这个这个参数行参。可以使用行参。你看这个形参不是AB吗?那么这这面你看我就出现了AB,那这就是红带参宏的一个定义,很简单定义,我们看这调呢,大家看这里,我对这里面再做一个说明。说明大家看这里,这边呢,有一个max。XY,这个就是调用我们的代参宏,代参就是调用调用代参的带参数的宏。那么他会怎么展开呢?各位同学,他会这样展开?它首先会进行字符串的替换,同时还会用这个X和Y来替换这个形式,什么意思啊,会再进行在。
04:06
红展开时,或者叫红替换时,红替换时这个这个红替换是在什么阶段处理的,是在预处理阶段。啊,由什么完成呢?由预处理器。预处理器完成。预处理器完成。对,这个是不是前面已经说过这个事情了,那么他在进行宏替换的时候。它会怎么样呢?会进行对会进行字符串的替换。替换。同时同时会。会干什么呢?会使用我们的食餐。食餐。诶,这个时辰。是实际参数。实际参数。时参去替换干什么呢?去哎,去替换替换这个行参。
05:02
那也就是说展开过后变成什么样呢?即展开后就是同学们看到的这个展开过后同替换后。它的红替换后会变成什么样子呢?会变成这样一个东西。变成你原先是这个吗?本身替换完了是这样,但是同时呢,还用13,现在13就是X和Y了。XY,于是这边两个都会被替换成对应的13 AA对应XB对应Y就变成这个了。大家理解这个意思了吧,当然这样一一替换不就是去执行了,嗯,按这个三元运算符来判断哪一个更大,哪一个更小吗?好,这就是对它的说明,我们来运行一下呗,同学们。好,我们试用一下,看看对不对哈。走起来,看看能不能使用。看看能否使用,诶这边有错误。错误的原因是不是前面?我们看哪里有错误。
06:01
打开一下一。好,我们看看错误在哪里。好,这个错误就藏的有点深了。我们。我们先编译一下。看看这边错误的地方哈。K。这边呢,他说有一个什么括号的问题,对不对,有一个括号的问题。有一个括号问题,那么我们看看是哪里的问题呢?我们来检查一下,好,我们来检查一下。我们看一下是不是这边哈,有一个文件没有注销哦,应该是这没有注销。把这个注销一下,看这边还有没有没有注销的,还是因为没有注销的原因导致的是吧?同学们,我们再来申请一下看看OK不。看是否OK了。好,我们看到现在呢,没有错误了,我们现在运行一下。
07:01
看看这一个带参的宏,我们是否能够搞定它,各位同学我现在输了啊,大家看这边呢,我在输入的时候是两个,呃,两个一起输进去,中间用空格开,输一个十打一个空格,为什么打一个空格看。我在输入的时候是这样输入的,SC,我一次性的传进去X和Y,再输一个值90回车。最大值是90,正确。这就是我们带参带参数的宏的一个使用,接着继续往下学习。那这个就是代餐的一个宏定义,下面呢,我们继续来看哈。下面呢,我们来看一下代餐宏定义的注意事项和细节,有些地方呢,我说一下就可以了,因为并不难,我们看第一个需要同学们注意,注意的地方是代餐。代参宏定义呢,行参之间可以出现空格,但是红名和行参之间不允许出现空格,什么意思说一下,比如说大家看这里。
08:01
这个地方你是可以出现空格的。这个不会有影响,但是你千万不要写成这个了,同学们看你如果写成了max本身原先这个max这样子的了。连在一起的,你在这打了个疯狗,完蛋。你,你让这个红名和你的行参之间出现空格,那么它会怎么理解呢?编译器会理解成这样理解,它会被认为是一个无参的宏定义,那么你的红max代表的字符串就变成了这一坨。变成了,变成最后面这一截了。能理解吧?也就是说你的这个红名,你的这个红名和形参之间绝对不能有空格,有空格的话,他就认为这个max。表示的字符串是这一节,那你整个这个结果都会是错的。第一个说完了,第二个在代餐红地中不会为行参形式参数分配内存,因此你可以不必指定数据类型,也就是说你在这个地方不像我们说的,诶这么写个int不用哦不用你也不用说,诶这么我说的是int不用。
09:05
为什么呢?为什么不需要指定这个数据类型呢?是因为在红调,因为这个它不会为形形式参数分配内存,呃,所以说它不会在这个阶段就会明确是什么数据类型。那么在这个宏调用的过程中,实参则必须包含数据类型,要用它去替换行参,因此实参必须有明确的数据类型。比如说前面这个题,大家看我们这个题是不是有X和Y啊?你看看这个X就有前面就有int来修饰它,就是说X是个int类类型的,Y是一个int类型的,他说的是这个意思,就是说实参必须有数据类型。再来看第三个细节。第三个细节是在红帝一中,字符串内的行参通常要用括号括起来,以避免出错。大家先来看我这一段代码,你们会认为它输出什么?
10:02
这有一个SQ。然后Y乘以Y。这个大家看到这是一个代餐的,理解一下这是一个代餐的。代餐的宏定义。没问题吧,大家看到这个Y呢,这个Y。呃,是一个形参,后面替换完了就是Y乘以Y,你看我怎么用的呢?大家看我这样用会出现什么情况。我用SQ,然后呢,我收我接收到一个A值。那这个A呢,是个特类型的,然后呢,我给他传了一个A加一。A加一,你们会认为你你们认为这个红替换购是长什么样子呀?这个宏替换后。是什么样子的?可能很多人认为,哦,老师我知道我知道是什么样子,不就是把你接收到这个A加一个一再去求它的平方吗?很多人可能认为是这样子的,我相信很多人是这样认为的,是A加一再乘以A加一,不对啊,你这样理解就不对了。
11:09
因为你本身这个Y并没有加括号,实际上实际上红替换的样子并不是这个东西,它是替换成什么样呢?他就原封不动的给你替换过来。大家看到没有,他说第一个是YY是什么呢?是A加一。它就给你替换成这样子的啊,这边后面乘还是一个YY还是A加一,所以说这个结果呢,跟你跟我们想的绝对不一样,它是这个A加一,再乘以A加一。那其实你的本意是什么呢?你的本意是想求这个Y?的平方,所以说我们这说了字符串内的行参通常要用括号括起来,以避免这个错误。也就是说你你的本意是想求出A加一的平方,那你这个地方其实是要这么写才对的。
12:02
对,你要这么去写,那么这个这样你传进去的A加一呢,它才会变成A加一刮起来,再乘以A加一刮起来。这才是对的,好,这个我就不去试了好不好?同学们,这个应该没有什么难度。对吧,你这个一说就明白的了,一说就明白,所以说这个地方提示大家,通常字符串的形成通常用小括号括起来,以避免错误。这是刚才老师给大家举的一个例子。就是说如果你不括起来,后面那个结果是A加一乘以A加一,而不是括小括号A加一乘以小括号A加一,明白这个意思吧,因为它只是个简单的替换。对,好,同学们,那么呃,那么这个关于代餐宏定义的注意事项,我们就先聊到这儿,我们把前面的内容梳理一下,代餐红第一我们讲了哪些内容呢?梳理一把。带上红定义,我们首先给同学们讲的是它的基本介绍,并且呢,举了一个案例,对不对?
13:06
对,我们先做了它的基本的介绍。然后呢,这边有一些说明。在说明完了过后呢,我们举了一个案例,我把案例来给他拿过来,案例在哪里呢?案例其实是在这个地方是不是。我把它拿过来,这边有相应的说明。插入一个表格。第一个说完。这个说完以后,是不是给同学们又说了我们在使用代餐宏定义的三个注意事项,尤其要小心,对于我们初学者,尤其是我们刚刚接触编程的人哈,容易把这个搞混淆。这是第二点,那么这边呢,有两点需要同学们注意的。那两点呢,呃,第一点是这块。好,我把这个呢给大家放到笔记中去,好吧,插入一个表格吧,这样子清晰一点,诶插入表格怎么插成这个样子了。
14:02
差成这个样子了。操作一个表格,我看这次还会乱吗哟吼。好,这样整理一下就可以了。变成这个样子啊,那这样我把它梳理到上面去。然后还有第三点,是不是刚才讲的第三点,第三点就是说我们在进行这个代餐宏定义使用的时候呢,一定要小心,如果说你你的整体思想是要把它当成一个整体,就是把这个形态看成一个整体,你最好把它括起来。不然的话,后面这个结果就错的,也就是说你前面这个地方,按理说求这个最大值哈。求,就是我们前面不是有个这个案例吗?其实理论上应该怎么写才是更好的呢?因为你防止将来这个是你是用这个A加,假如你这是A1加X这样子,其实你理论上应该这么去写。看到没有?其实应该这样去写才是最标准的写法。哎,其实你应该这么去写。你你因为你这样写了过后呢,你就不用担心,你就不用担心什么呀,不用担心原后面人家在调用的时候,这边写的是X加一或者是X加二。
15:09
你明白这意思,好,理论上这样写更合理哦,我还撤回去好不好?因为原始的代码我是这样写的。就是我提醒大家,提醒大家这个细节哪里呢,就这好,我把这个代码给他拉过来。这是我们说的第三个特点。第三个就是。这块。放到一边来。好案例呢?我给大家梳理到笔记中去。就这个小案例吧。各位,那关于我们这一个带参带参数的宏定义的细节,还有它的基本用法,我们就给大家聊到这里。
我来说两句