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);
}