一、宏
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