C语言带参数宏定义

C语言带参数宏定义教程

C 语言 中的 是支持带参数的,就像 函数参数 一样,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。

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)

案例

C语言带参数宏定义

带参数宏定义

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

程序运行后,控制台输出如下图所示:

05_c语言带参数宏定义.png

我们首先定义了一个带参数的宏 INC,该宏接受一个参数 x,实现的功能是使用自增将 x 的值加一,接着,我们再次定义了一个宏 DEC,该宏实现的功能是将 y 的值减一。

最后,我们分别调用了这两个宏,我们可以看到,宏 INIC 实现了将 x 的值加一,宏 DEC 实现了将 y 的值减一。

C语言带参数宏定义

带参数宏定义

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

程序运行后,控制台输出如下图所示:

06_c语言带参数宏定义.png

我们首先定义了一个带参数的宏 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; }

程序运行后,控制台输出如下图所示:

07_c语言带参数宏定义.png

我们看到,这次我们传入了 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; }

程序运行后,控制台输出如下图所示:

08_c语言带参数宏定义.png

这次,我们看到,程序不再报错,因为,我们将运行的参数全部使用了 () 括起来了,因此,在使用宏参数时,建议将所有的参数都是要 () 括起来。

C语言带参数宏定义教程总结

C 语言中的宏是支持带参数的,就像函数参数一样,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。