1、有参宏的定义方法 C语言允许宏带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,对带参数的宏,在调用中,不仅要宏展开,而且要用实参取代替形参。
带参宏定义的一般形式为: define 宏名(参数表) 字符串 例如:
- //定义一个带参宏
- #define Add(x,y) x+y
- #include <stdio.h>
-
- int main(int argc, const char * argv[])
- {
- printf("x + y = %d", Add(10, 20));
- return 0;
- }
复制代码
打印结果: x + y = 30
2、注意事项 1)宏的形参之间可以出现空格,但是【宏名】和【形参】之间不能出现空格 例如: - #define Add (x,y) x+y //报错
- #define Sub(x, y) x + y //不报错
复制代码
2)在带参宏定义中,形式蚕食不分配内存单元,因此不必做类型定义,而宏调用中的实参有具体值,要用他们去代换形参,因此必须做类型说明。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”,而带参宏中,只是符号代表,不存在值传递的问题。
3)在宏定义中的形参是标识符,而宏调用的实参可以是表达式
4)在宏定义中,【字符串内的形参通常要用括号括起来】以避免出错, 例如:
- #define Mul(x,y) x*y
-
- #include <stdio.h>
-
- int main(int argc, const char * argv[])
- {
- int a = 2, b = 3;
- printf("x + y = %d", Mul(a + b, a*b));
- return 0;
- }
复制代码
打印结果: x + y = 20
期待结果:(2+3)*(2*3) =30,但是宏展开的时候替换成了2+3*2*3 = 20 因此【字符串内的形参通常要用括号括起来】以避免出错, 如下: - #define Mul(x,y) (x)*(y)
-
- #include <stdio.h>
-
- int main(int argc, const char * argv[])
- {
- int a = 2, b = 3;
- printf("x + y = %d", Mul(a + b, a*b));
- return 0;
- }
复制代码
打印结果: x + y = 30
|