do
{
// do sth
}
while(0)
在c++开源库中,do{}while()语法随处可见,可见其非常重要!!!!那么,什么原因让其变得如此重要呢?
从例子看起:
普通版:
#define Test()\
func1();\
func2();
当在代码中使用这样使用Test时
if( sth == true)
Test();
程序处理后的版本实际上就成了
if(sth == true)
func1();
func2();
很显然,这不是我们想要的逻辑。
加{}版
为了解决上面的bug,只需要加个{}就可以了
#define Test() { func1(); func2();}
现在游戏逻辑就正确了。既然一个大括号就能解决问题,那为什么还要do...while呢?再看下面的例子
if(sth == true)
Test();
else
sthElse();
若将{}版的定义用于if...else语句,编译时就会出现编译错误!因为处理后的版本是这样的
if(true == sth)
{
func1();
func2();
};
else
sthElse();
在if...else中间多了个分号,导致else找不到与之匹配的if!!!!很明显,{}版的宏不通用!
do...while版
#define Test() do {func1(); func2();} while(0)
现在这个版本就能解决上面的问题了,可见,
宏定义中使用do...while是为了提高代码的通用性!
下面再看do...while的第二个重要用途
bool test()
{
int *p = new int();
if(!bOk(p))
{
delete p;
p = null;
return false;
}
if(!bOk2(p))
{
delete p;
p = null;
return false;
}
if(!bOk3(p))
{
delete p;
p = null;
return false;
}
delete p;
return false;
}
这样的代码虽然没什么bug,但太丑了!下面用do...while美化
#define BreakIf(b) if(b) break
bool test()
{
int* p = new int();
bool bOk = false;
do
{
bOk = bOk1(p);
BreakIf(!bOk);
bOk = bOk2(p);
BreakIf(!bOk);
bOk = bOk3);
BreakIf(!bOk);
}
delete p;
return bOk;
}
这就是
do...while的第二个重要作用,重构代码