宏定义为何使用do-while语句

宏定义为何使用do-while语句

最近在阅读开源代码的过程中,发现宏定义中大量使用了do-while语句。有时感觉这是不是多此一举呢。于是去网上查阅资料就有了本篇博客。

最近看到的代码中的宏定义结构如下:

#define MARCO_FUN() 		do{\
Function();\
}while(0)

第一次看心想直接#define MARCO_FUN Function()不就可以,后来想一想可能是为了确定独立的代码块,避免和外部的代码语义混淆。毕竟宏的本质就是预编译时的简单替换。


下面进行总结下do-while用于宏的作用:

  • 空的宏定义避免warning
#define foo() do{}while(0)
  • 存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现
#define MARCO_FUN() 		do{\
Function01();\
Function02();\
...
}while(0)
  • 如果出现在判断语句中的宏可以保证是作为一个整体来处理的
#define foo(x) \
Function01();\
Function02();
//这种情况下会出现Function01和Function02不会同时被执行的情况,而这显然不是程序设计的目的
if(nullptr != pPointer)
	foo();
  • 上面一种情况用单独的{}的实现,但是为什么一定要用do{}while(0),在把宏引入代码中,会多出一个分号,从而会报错。看下面代码:
#define	swap(x,y) {int tmp; tmp=x;x=y;y=tmp;}

if(x>y)
	swap(x,y);
else       //error, parse error before else
	otheroperator();

小结
使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低

你可能感兴趣的:(C/C++,宏定义,do-while)