您的位置:首页 > 其它

do...while(0)的妙用

2015-08-27 23:15 253 查看
在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。

但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。

1. do...while(0)消除goto语句。

通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样:

version 1



bool Execute()

{

// 分配资源

int *p = new int;

bool bOk(true);

// 执行并进行错误处理

bOk = func1();

if(!bOk)

{

delete p;

p = NULL;

return false;

}

bOk = func2();

if(!bOk)

{

delete p;

p = NULL;

return false;

}

bOk = func3();

if(!bOk)

{

delete p;

p = NULL;

return false;

}

// ..........

// 执行成功,释放资源并返回

delete p;

p = NULL;

return true;

}

这里一个最大的问题就是代码的冗余,而且我每增加一个操作,就需要做相应的错误处理,非常不灵活。于是我们想到了goto:

version 2

bool Execute()

{

// 分配资源

int *p = new int;

bool bOk(true);

// 执行并进行错误处理

bOk = func1();

if(!bOk) goto errorhandle;

bOk = func2();

if(!bOk) goto errorhandle;

bOk = func3();

if(!bOk) goto errorhandle;

// ..........

// 执行成功,释放资源并返回

delete p;

p = NULL;

return true;

errorhandle:

delete p;

p = NULL;

return false;

}

代码冗余是消除了,但是我们引入了C++中身份比较微妙的goto语句,虽然正确的使用goto可以大大提高程序的灵活性与简洁性,但太灵活的东西往往是很危险的,它会让我们的程序捉摸不定,那么怎么才能避免使用goto语句,又能消除代码冗余呢,请看do...while(0)循环:

version3



bool Execute()

{

// 分配资源

int *p = new int;

bool bOk(true);

do

{

// 执行并进行错误处理

bOk = func1();

if(!bOk) break;

bOk = func2();

if(!bOk) break;

bOk = func3();

if(!bOk) break;

// ..........

}while(0);

// 释放资源

delete p;

p = NULL;

return bOk;

}

“漂亮!”, 看代码就行了,啥都不用说了...

2 宏定义中的do...while(0)
为了宏展开的时候不会出错。

如过直接放在花括号会出错的,不如

C/C++ code

?
下面是使用的地方

C/C++ code

?
展开后是这样的

C/C++ code

?
那么编译就会出错,可以验证使用d0{}while(0)就不会出错

linux内核源码经常见这玩意

C/C++ code

?
前面几个都是有问题的,只有do while(0)解决得比较好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: