为什么要用do-while(0)?
今天读代码时候,看到这样的代码。。
#define MG_SET_PTRPTR(_ptr, _v) \ do { \ if (_ptr) *(_ptr) = _v; \ } while (0)
1、对于带有if 语句的宏,无论是内核还是开源代码,都是用到了do while(0)技巧。问题来了,为什么要这样搞呢?
很简单,假设存在
if XXX { if (_ptr) *(_ptr) = _v; } else { .... }
如果这里没有do while,那么是不是后面的else语句匹配出错了呢????
导致的效果是:编译能通过,但是执行出错。
2、还会存在一种极度恶心的情况。
假设存在宏展开后为:
a = a + 1; b = a;
那么,有:
if xxxx a = a + 1; b = a; else XXXX
那么会导致编译通不过。
所以内核也好,开源软件也好,为了解决宏带来的问题,不得不引入这种do while(0) 这样的代码。。。