background image

P(D F,c,d);
P(D F,e,f);
}
带参宏定义

 

  C语言允许宏带有参数。在宏定义中的参数称为形式参数, 在宏调用中的参数称为

 

实际参数。对带参数的宏,在调用中,不仅要宏展开, 而且要用实参去代换形参。

 

  带参宏定义的一般形式为: #define 宏名(形参表) 

 

字符串 在字符串中含有各个形参。

 

带参宏调用的一般形式为: 宏名(实参表);
例如:
#define M(y) y*y+3*y /*宏定义*/
:
k=M(5); /*宏调用*/
: 在宏调用时,用实参 5 去代替形参 y

 

, 经预处理宏展开后的语句

 

为: k=5*5+3*5
#define MAX(a,b) (a>b)?a:b
main(){
int x,y,max;
printf("input two numbers: ");
scanf("%d%d",&x,&y);
max=MAX(x,y);
printf("max=%d\n",max);
}
  上例程序的第一行进行带参宏定义,用宏名 MAX 表示条件表达式(a>b)?a:b,形参
a,b 均出现在条件表达式中。程序第七行 max=MAX(x,
y)为宏调用,实参 x,y,将代换形参 a,b

 

。宏展开后该语句为: max=(x>y)?x:y;用于计算 x,y

中的大数。对于带参的宏定义有以下问题需要说明:
1. 带参宏定义中,宏名和形参表之间不能有空格出现。

 

例如把: #define MAX(a,b) (a>b)?a:b

 

写为: #define MAX (a,b) (a>b)?a:b 将被认为是无参

宏定义,宏名 MAX

 

代表字符串 (a,b)(a>b)?a:b。

 

宏展开时,宏调用语句: max=MAX(x,y);

 

将变为: max=(a,b)(a>b)?a:b(x,y);这显然是错误

的。
2. 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参
有具体的值。要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在
函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参 ,

进行 值传递 。而在带参宏中,只是符号代换,不存在值传递的问题。
3. 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
#define SQ(y) (y)*(y)
main(){
int a,sq;
printf("input a number: ");
scanf("%d",&a);
sq=SQ(a+1);
printf("sq=%d\n",sq);
}