C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。
对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。
带参宏定义的一般形式为:
#define 宏名(形参列表) 字符串
例如:
#define M(y) y * y+3y //宏定义
// TODO:
k=M(5); //宏调用
在宏展开时,用实参 5 去代替形参 y,经预处理程序展开后的语句为k=5 * 5+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(“max=%d\n”, max);
return 0;
}
带参数的宏和函数很相似,但有本质上的区别:宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。
- 带参宏定义中,形参之间可以出现空格,但是宏名和形参列表之间不能有空格出现。
- 在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去替换形参,因此实参必须要指明数据类型。
- 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
对于带参宏定义不仅要在参数两侧加括号,还应该在整个字符串外加括号。#define SQ(y) ((y)*(y))