谈谈#define st(x) do { x } while (__LINE__ == -1) 的理解

最近在学习TI 的BLE协议栈,其中发现了一个问题:

#define HAL_ENTER_CRITICAL_SECTION(x)   st( x = EA;  HAL_DISABLE_INTERRUPTS(); )
#define HAL_EXIT_CRITICAL_SECTION(x)    st( EA = x; )
其中st(x)应作何解释?
#define st(x)      do { x } while (__LINE__ == -1)

其中:
 __LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的,
所以__LINE__ == -1 等同于0,化简为:
#define st(x)      do { x } while (0)

2,do {} while (0)通常用于宏中, 为的是避免如下情况:

#define st(x) x

那么我们在调用 if (0) st(a = b; b = c;) 时会被解释成

if(0)
    a = b;
b = c;

可见, b = c会任何时候都执行。
所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 
另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉.

综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用.

注: 如果你看过 linux 内核源代码, 这个技巧非常常见



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值