c 宏定义详解


看博文背景 :       已经了解一些c语言中的基本宏定

博文 目的:    让你写出更加出色的宏定义    


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

该宏 主要是 查找 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

    

  

 

                                                                                 

             

              总结: 以上 可知道  宏 本质 就是 代码 替换 ,她 比 函数 执行效率 跟高 , 到是 没有 函数 安全 。 她 需要 程序员更加 规范的 使用宏。  

                                                                              

                                                                                

                                                                             

                                                                         

                                                                            

                                                                                 

                                                                               

        

                                                                                                  

                                                                              

                                                                      

                                                                         

                                                                   

                                                                 

                                                                       

                                                                 

                                                                               

           

                                                                                 

                         

  

  

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值