C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为#define 宏名(形参表) 字符串
带参宏调用的一般形式为:宏名(实参表);
例如:
#define M(y) y*y+3*y /*宏定义*/
……
k=M(5); /*宏调用*/
……
在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:
k=5*5+3*5
#include
#define MAX(a,b) (a>b)?a:b
void main()
{
int x, y, max;
printf("input two numbers: ");
scanf("%d %d", &x, &y);
max = MAX(x, y); // max = (x>y) ? x : y;
printf("The max is %d\n\n", max);
}
1. 带参宏定义中,宏名和形参表之间不能有空格出现
例如把:
#define MAX(a,b) (a>b)?a:b
写为:
#define MAX (a,b) (a>b)?a:b//这样是错误的
#include
#define SAY(y) (y)
void main()
{
int i = 0;
char say[] = {73, 32, 108, 111, 118, 101, 32, 102, 105, 115, 104, 99, 46, 99, 111, 109, 33, 0};
while( say[i] )
{
say[i] = SAY(say[i]*1+1-1);
i++;
}
printf("\n\t%s\n\n", say);
}
#include
#define SQ(y) (y)*(y) // y*y试试
void main()
{
int a, sq;
printf("input a number: ");
scanf("%d", &a);
sq = SQ(a+1); // sq = a+1 * a+1
printf("sq = %d\n", sq);
}