欢迎来到天天文库
浏览记录
ID:11187678
大小:20.35 KB
页数:6页
时间:2018-07-10
《do...while(0) do...while(false)的妙用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、do...while(0)do...while(false)的妙用 在C++中,有三种类型的循环语句:for,while,和do...while,但是在一般应用中作循环时,我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。1.do...while(0)消除goto语句。通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先
2、释放资源,我们的代码可能是这样:version1[cpp]viewplaincopy1.bool Execute() 2.{ 3. // 分配资源 4. int *p = new int; 5. bool bOk(true); 6. 7. // 执行并进行错误处理 8. bOk = func1(); 9. if(!bOk) 10. { 11. delete p; 12. p = NULL; 13. return false; 1
3、4. } 15. 16. bOk = func2(); 17. if(!bOk) 18. { 19. delete p; 20. p = NULL; 21. return false; 22. } 23. 24. bOk = func3(); 25. if(!bOk) 1. { 2. delete p; 3. p = NULL; 4. return false; 5. } 6
4、. 7. // .......... 8. 9. // 执行成功,释放资源并返回 10. delete p; 11. p = NULL; 12. return true; 13. 14.} 这里一个最大的问题就是代码的冗余,而且我每增加一个操作,就需要做相应的错误处理,非常不灵活。于是我们想到了goto:version2[cpp]viewplaincopy1.bool Execute() 2.{ 3. // 分配资源 4. int *p = new
5、int; 5. bool bOk(true); 6. 7. // 执行并进行错误处理 8. bOk = func1(); 9. if(!bOk) goto errorhandle; 10. 11. bOk = func2(); 12. if(!bOk) goto errorhandle; 13. 14. bOk = func3(); 15. if(!bOk) goto errorhandle; 16. 17. // .......... 18. 19.
6、 // 执行成功,释放资源并返回 20. delete p; 21. p = NULL; 22. return true; 23. 1.errorhandle: 2. delete p; 3. p = NULL; 4. return false; 5. 6.} 代码冗余是消除了,但是我们引入了C++中身份比较微妙的goto语句,虽然正确的使用goto可以大大提高程序的灵活性与简洁性,但太灵活的东西往往是很危险的,它会让我们的程序捉摸不定,那么
7、怎么才能避免使用goto语句,又能消除代码冗余呢,请看do...while(0)循环:version3[cpp]viewplaincopy1.bool Execute() 2.{ 3. // 分配资源 4. int *p = new int; 5. 6. bool bOk(true); 7. do 8. { 9. // 执行并进行错误处理 10. bOk = func1(); 11. if(!bOk) break; 12. 13. bO
8、k = func2(); 14. if(!bOk) break; 15. 16. bOk = func3(); 17. if(!bOk) break; 18. 19. // .......... 20. 21. }while(0); 22. 23. // 释放资
此文档下载收益归作者所有