学到的一个宏技巧

   最近看到孟岩的一篇文章介绍了一个C语言的宏定义技巧,觉得颇有价值。宏定义如下:

#define RETURN switch(Exception_stack = /
 Exception_stack->prev,0) default: return

    看得出这是定义了一个实现C中return功能的宏RETURN,但它保证了在return之前一定会执行Exception_stack = Exception_stack->prev这个操作,而且任何场合出现的return都能用这个RETURN宏来代替。觉得很平凡吗?那好,我们来尝试其它的做法。比如:

#define RETURN_1 if(Exception_stack = /
 Exception_stack->prev,1) return

    这个RETURN在下面情况中有什么问题吗?

if(...)
   RETURN_1 1;
else
{
   // do something
   ....
}
    我们看看宏展开后的代码:

if(...)
   if(Exception_stack = Exception_stack->prev, 1)
      return 1;
else
{
   // do something
   ....
}
    很明显,我们的else将会与宏定义中的if而不是第一个if匹配,这是我么想要的吗?唔,当然不是。那看看另外一个:

#define RETURN_2 return Exception_stack = /
 Exception_stack->prev,

    如果有这样一个函数

void foo()
{
   ....

   return;
}
    这种不带参数的return用法是合法而且相当常见的,那换成上面的RETURN_2行吗?呵呵,小不死这样的傻瓜都看得出有语法错误。当然还可以这样定义:

#define RETURN_3(_X) do{if(Exception_stack = /
 Exception_stack->prev, 1) return _X}while(0)

    它倒是可以在上面两种情况下使用,但是用它的时候非得带个括号,有句话说得好:“如非必要,别去打破约定俗成的习惯”。其实确实还存在一种与上述RETURN等价的宏定义:

#define RETURN_4 for(Exception_stack = /
 Exception_stack->prev; ;) return

    switch与for的这种用法确实值得借鉴,用得好的话在C中就可以定义出安全的宏了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值