为什么使用do{}while(0)来进行宏定义

最近发现很多代码在进行宏定义的时候使用喜欢使用
#define MACRO_NAME(para) do{macro content}while(0)
的格式,总结了以下几个原因:
 
1,空的宏定义避免warning:
#define foo() do{}while(0)
 
2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。
 
3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:
#define foo(x) 
action1(); 
action2();

在以下情况下:

if(NULL == pPointer)
   foo();

就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。

 
4,以上的第3种情况用单独的{}也可以实现,但是为什么一定要一个do{}while(0)呢,看以下代码:
#define switch(x,y) {int tmp; tmp=x;x=y;y=tmp;}
if(x>y)
switch(x,y);
else       //error, parse error before else
otheraction();

在把宏引入代码中,会多出一个分号,从而会报错。

原文地址:https://www.cnblogs.com/Hali-yang/p/3447911.html