上一次是无参的宏定义;作为进阶,这次是带参的宏定义。
- C语言允许宏定义带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
- 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
- 带参宏定义的一般形式:
#define 宏名(形参表) 字符串
注意:
- 带参宏定义中,宏名和形参表之间不能有空格出现。
例如以下给出的代码,
#define M(y) yy+3y 和
#define M (y) yy+3y
是不一样的,第二者会出现编译错误。 - 在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。
- 与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。
而带参宏中,只是符号代换,不存在值传递的问题。 - 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
- 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
例如:
#include<stdio.h>
#define sd(y) yy
和
#include<stdio.h>
#define sd(y) (y)(y)
第二者为正确;
因为当式子为a+1;y*y这个式子得不出预想结果,符号优先级。 - 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。
示例:
#include<stdio.h>
int main()
{
int i=1;
int aq(int y);
while(i<=5)
{
printf("%d\n",aq(i++));
}
}
int aq(int y)
{
return ( (y)*(y));
}
和
#include<stdio.h>
#define aq(y) ((y)*(y))
int main()
{
int i=1;
while(i<=5)
{
printf("%d\n",aq(i++));
}
}
其运行结果截然不同。为啥不同
这个坑后续补上。
带参宏调用的一般形式为:宏名(实参表);
例如:
#define M(y) yy+3y /宏定义/
…
k=M(5); /宏调用/
…
在宏调用时,用实参5 去代替形象y,经预处理宏展开后的语句;k=55+35
一个简单示例:
#include<stdio.h>
#define MAX(a,b) (a>b)?a:b
int main()
{
int x,y,max;
printf("input two numbers: ");
scanf("%d%d",&x,&y);
max=MAX(x,y);
printf("The max is %d\n\n",max);
}
运用带参宏定义对两数进行比较;
此外,宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序中。
以上总结,经小甲鱼视频学习得来。