A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chunhuayun 中级黑马   /  2015-9-30 01:12  /  914 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、有参宏的定义方法
C语言允许宏带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,对带参数的宏,在调用中,不仅要宏展开,而且要用实参取代替形参。

带参宏定义的一般形式为:
define  宏名(参数表)  字符串
例如:

  1. //定义一个带参宏
  2. #define Add(x,y) x+y
  3. #include <stdio.h>

  4. int main(int argc, const char * argv[])
  5. {
  6.     printf("x + y = %d", Add(10, 20));
  7.     return 0;
  8. }
复制代码


打印结果:
x + y = 30

2、注意事项
1)宏的形参之间可以出现空格,但是【宏名】和【形参】之间不能出现空格
例如:
  1. #define Add (x,y) x+y //报错
  2. #define Sub(x, y) x + y //不报错
复制代码


2)在带参宏定义中,形式蚕食不分配内存单元,因此不必做类型定义,而宏调用中的实参有具体值,要用他们去代换形参,因此必须做类型说明。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”,而带参宏中,只是符号代表,不存在值传递的问题。

3)在宏定义中的形参是标识符,而宏调用的实参可以是表达式

4)在宏定义中,【字符串内的形参通常要用括号括起来】以避免出错,
例如:

  1. #define Mul(x,y) x*y

  2. #include <stdio.h>

  3. int main(int argc, const char * argv[])
  4. {
  5.     int a = 2, b = 3;
  6.     printf("x + y = %d", Mul(a + b, a*b));
  7.     return 0;
  8. }
复制代码


打印结果:
x + y = 20

期待结果:(2+3)*(2*3) =30,但是宏展开的时候替换成了2+3*2*3 = 20
因此【字符串内的形参通常要用括号括起来】以避免出错,
如下:
  1. #define Mul(x,y) (x)*(y)

  2. #include <stdio.h>

  3. int main(int argc, const char * argv[])
  4. {
  5.     int a = 2, b = 3;
  6.     printf("x + y = %d", Mul(a + b, a*b));
  7.     return 0;
  8. }
复制代码



打印结果:
x + y = 30

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马