博文 目的: 让你写出更加出色的宏定义
该宏 主要是 查找 c , b 之中的 最大 的 一位数 , 但是 有个 问题 就是 当 这样 调用宏
a = MAX(2+1,4+1)* 5 宏展开为 a = 2+1>4?2+1:4+1*5 显然 和 原意
不同 为 避免 这种情况 发生 一般 改为 这样写宏
#define MAX(c,b) ( (c) >(b)?(c):(b) )
然后在展开 a =( (2+1)>(4+1) ?(2+1):(4+1) )*5 这样 就 解决了 以上 问题 ,
但是 是不是 就保证 我们 写的 宏 就不会有问题 了? 显然 不是 , 我们在看下 如下 调用 宏
int a = 3;
int b = 4;
MAX(++a, ++b) 宏展开为 ( (++a)>(++b)?(++a):(++b) )
眼尖的读者 可以 已经发现 得出的结果 为 6 而不是 5 这 又是 怎么 一回事呢? 其实 仔细 看这宏展开 多 调用了 一次 ++ , 所以 结果 就 多出了一个 1 为 6 。
那 我们 应该 怎么 解决这问题 呢 ? 其实 就好的 办法是 避免这种 调用 , 但是 具体该 如何写出 更好的宏定义 来 避免 这问题 , 笔者 , 就不知 该 如何 定义, 期望 ,又强悍的读者为 我解答 疑问 ?
为此 我们 在 看下 如下 宏
#define swap( a , b ) int tem = (a) ; (a ) = (b) ; (b) = tem
这是 交换 两个 变量值 的 宏 ; 这个 宏 是 需要 调整的 ;
看 如下 调用
while(1)
swap(a,b);
我们 展开 为 while(1) int tem = (a); (a) = (b) ; (b) = tem ;
这个 语句 没办法 是实现 两 变量 交换;
我们 在看 以下 两个 宏
#define swap(a,b) { int tem = (a) ; (a) = (b) ; (b) = tem ; }
#define swap(a, b) do(int tem = (a) ; (a) = (b) ; (b) = tem ; } while(0)
以上 两种 都可以 解决 上面出现的问题.
(2) #define 和 typedef 哪个好
如下 #define int* pint
typedef pint int*
区分 这 两种 哪个 好 , 看 如下 语句 定义
在 typedef 中 pint a , b ;
这时 两变量 都是 int * 类型
在 宏中 pint a , b ; 宏 展开 得 int * a , b ;
这时 变量 a wei int * 而 变量 b 为 int
总结: 以上 可知道 宏 本质 就是 代码 替换 ,她 比 函数 执行效率 跟高 , 到是 没有 函数 安全 。 她 需要 程序员更加 规范的 使用宏。