C语言预编译处理,如何定义一个带参数 宏?如何取消宏定义?

取消宏定义定义变量的时候,不能够重复定义同名变量;同理,定义宏的时候,不可以重复定义同名的宏 。例如:
#define MAX 1000
#define MAX 50
此时,重复定义MAX宏,是不合法的代码 。但是,我们想在代码中,对MAX宏进行多次不同的定义,应该怎么样?
此时,可以考虑使用#undef来取消之前的宏定义,然后,再重新定义宏 。程序测试例子如下:

C语言预编译处理,如何定义一个带参数 宏?如何取消宏定义?

文章插图
 
【C语言预编译处理,如何定义一个带参数 宏?如何取消宏定义?】程序运行结果如下:
C语言预编译处理,如何定义一个带参数 宏?如何取消宏定义?

文章插图
 
可以看到,在程序中,对MAX宏进行了多次定义 。在重新定义MAX宏之前,先使用#undef关键字来取消宏的定义,然后,再重新定义宏 。
有参宏定义定义宏的时候,可以携带参数,如同定义函数一样,有形参列表 。定义格式如下:
#define 宏名(形参列表) 表达式
注意:这里的形参列表,与函数的形参列表有区别 。函数的形参列表有变量的数据类型名,这里定义宏的形参列表,不需要数据类型名 。使用带参数宏时,如果需要传递参数,调用方法如同调用函数一样 。程序测试例子如下:
C语言预编译处理,如何定义一个带参数 宏?如何取消宏定义?

文章插图
 
程序运行结果如下:
C语言预编译处理,如何定义一个带参数 宏?如何取消宏定义?

文章插图
 
可以看到,编译程序预处理的时候,碰到 print(10, 11);宏,就对宏进行替换展开,替换为:
printf("x = %d, y = %dn", x, y);
但是,x, y 符号是宏的参数,所以,需要进行替换 。根据宏定义的参数顺序是 print(x, y);所以,在调用print(10, 11)宏的时候,按顺序替换,使用10替换x,11替换y 。




    推荐阅读