最近在学习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 内核源代码, 这个技巧非常常见
转载于http://blog.youkuaiyun.com/oyyj42/article/details/26235613