C 语言 中的 宏 是支持带参数的,就像 函数参数 一样,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
#define identify(paramlist) expression
参数 | 描述 |
---|---|
#define |
定义宏使用的关键字。 |
identify |
宏的标识符,也就是宏名。 |
paramlist |
宏的参数列表。 |
expression |
该宏所代表的表达式或者常量值。 |
#define INC(x) x++
我们定义了一个宏 INC,该宏接受一个参数 x,该宏实现的功能是将当前 x 的值自增。
#define TEST(x) (x + TEST(x))被展开为1 + TEST(1)
。带参数宏定义
#include <stdio.h>
#define INC(x) x++
#define DEC(x) x--
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int x = 10;
int y = 10;
printf("Before x = %d, y = %d\n", x, y);
INC(x);
DEC(y);
printf("After x = %d, y = %d\n", x, y);
return 0;
}
程序运行后,控制台输出如下图所示:
我们首先定义了一个带参数的宏 INC,该宏接受一个参数 x,实现的功能是使用自增将 x 的值加一,接着,我们再次定义了一个宏 DEC,该宏实现的功能是将 y 的值减一。
最后,我们分别调用了这两个宏,我们可以看到,宏 INIC 实现了将 x 的值加一,宏 DEC 实现了将 y 的值减一。
带参数宏定义
#include <stdio.h>
#define SQ(x) x*x
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int x = 10;
int sqx = SQ(x);
printf("x = %d, sqx = %d\n", x, sqx);
return 0;
}
程序运行后,控制台输出如下图所示:
我们首先定义了一个带参数的宏 SQ,该宏接受一个参数 x,实现的功能是返回变量 x 的平方,接着,我们调用了该宏,并传入了变量 x,结果返回了 x 的平方。这个程序,貌似没有问题,现在,我们修改程序如下:
#include <stdio.h>
#define SQ(x) x*x
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int sqx = SQ(5+5);
printf("sqx = %d\n", sqx);
return 0;
}
程序运行后,控制台输出如下图所示:
我们看到,这次我们传入了 5+5,但没有返回 100,而是 35,这是因为,SQ(5+5) 被展开为了 5+5*5+5,因此是 35,而不是我们期望的 100,现在,我们将程序修改如下:
#include <stdio.h>
#define SQ(x) ((x)*(x))
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int sqx = SQ(5+5);
printf("sqx = %d\n", sqx);
return 0;
}
程序运行后,控制台输出如下图所示:
这次,我们看到,程序不再报错,因为,我们将运行的参数全部使用了 () 括起来了,因此,在使用宏参数时,建议将所有的参数都是要 () 括起来。
C 语言中的宏是支持带参数的,就像函数参数一样,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。