do while(0)的另一个用途:消除goto语句。

      在之前的博文中,我们讨论了do while(0)在宏定义中的重要用途, 下面我转载一篇博文说说do while(0)在消除goto语句方面的用途。


      转载地址:http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html


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;
   
}


       我的个人评论:do while(0)在此处确实妙,但是, 用goto未尝不可, 不要将goto鄙视得一无是处。



   

你可能感兴趣的:(do while(0)的另一个用途:消除goto语句。)