6 - 预处理器

一、宏

1、宏定义

1.1、括号问题

#define abs(x) x > 0 ? x : -x            /* error */
#define abs(x) ((x) >= 0) ? (x) : -(x))  /* ok */

abs(a - b)  /* 用于验证参数要用括号括起来 */
1 + abs(5)  /* 用于验证整个表达式也要用括号括起来 */

1.2、空格问题

#define f (x) ((x) - 1)  /* error */
#define f(x) ((x) - 1)   /* ok */

printf("f(3): %d, f (3): %d\n", f(3), f (3));  /* 宏调用不受空格影响 */

2、宏调用

调用宏时,需确保宏参数没有副作用(++/–)

#define max(a,b) ((a) > (b) ? (a) : (b))

x[0] = 2;
x[1] = 3;
x[2] = 1;

biggest = x[0];
i = 1;

while (i < 3)
  biggest = max(biggest, x[i++]);
  /*
   * 展开后:biggest = ((biggest) > (x[i++]) ? (biggest) : (x[i++]))
   * biggest 最终结果是 1,而非 3,而且,while 循环仅执行一次就结束了
   */

/* 解决方案:使用没有副作用的宏参数 */
biggest = x[0];
for (i = 1; i < 3; i++)
  biggest = max(biggest, x[i]);

二、宏不是函数

更新 ing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值