预处理(2)

上一次是无参的宏定义;作为进阶,这次是带参的宏定义。

  1. C语言允许宏定义带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
  2. 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
  3. 带参宏定义的一般形式:
    #define 宏名(形参表) 字符串

注意:

  1. 带参宏定义中,宏名和形参表之间不能有空格出现。
    例如以下给出的代码,
    #define M(y) yy+3y 和
    #define M (y) yy+3y
    是不一样的,第二者会出现编译错误。
  2. 在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。
  3. 与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。
    而带参宏中,只是符号代换,不存在值传递的问题。
  4. 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
  5. 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
    例如:
    #include<stdio.h>
    #define sd(y) yy

    #include<stdio.h>
    #define sd(y) (y)
    (y)
    第二者为正确;
    因为当式子为a+1;y*y这个式子得不出预想结果,符号优先级。
  6. 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。
    示例:
#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);
}

运用带参宏定义对两数进行比较;

此外,宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序中。

以上总结,经小甲鱼视频学习得来。

猜你喜欢

转载自blog.csdn.net/yooppa/article/details/112464510
今日推荐