是否使用GOTO?

目前,我正在一个项目中大量使用goto语句。goto语句的主要目的是在例程中具有一个清理段,而不是多个return语句。如下所示:


BOOL foo()

{

   BOOL bRetVal = FALSE;

   int *p = NULL;


   p = new int;

   if (p == NULL)

   {

     cout<<" OOM \n";

     goto Exit;

   }


   // Lot of code...


Exit:

   if(p)

   {

     delete p;

     p = NULL;

   }

   return bRetVal;

}

这使工作变得更加容易,因为我们可以在代码的一个部分(即在“退出”标签之后)跟踪清理代码。


但是,我读过很多地方,使用goto语句是不好的做法。


目前,我正在阅读《代码完成》一书,它说我们需要使用靠近其声明的变量。如果使用goto,则需要在首次使用goto之前声明/初始化所有变量,否则编译器会给出错误消息,表明goto语句跳过了xx变量的初始化。


哪种方法正确?


从斯科特的评论:


似乎使用goto从一个部分跳转到另一部分是不好的,因为这会使代码难以阅读和理解。


但是,如果我们仅使用goto前进并指向一个标签,则应该很好(?)。


萧十郎
浏览 447回答 3
3回答

江户川乱折腾

我从未在C ++中使用过goto。曾经&nbsp;永远&nbsp;如果有这种情况,应该使用它,这种情况非常罕见。如果您实际上正在考虑将goto作为您逻辑的标准部分,那么事情就已经发生了。

红糖糍粑

人们对于gotos和您的代码基本上有两点:后藤很糟糕。&nbsp;在一个需要使用goto的地方遇到这种情况非常罕见,但是我不建议您完全打败它。尽管C ++具有足够智能的控制流程,但很少适合使用goto。您的清理机制是错误的:这一点更为重要。在C语言中,自己使用内存管理不仅可以,而且通常是做事的最佳方法。在C ++中,您的目标应该是尽可能避免内存管理。您应该尽可能避免内存管理。让编译器为您完成。而不是使用new,而只是声明变量。真正需要内存管理的唯一时间是事先不知道数据大小的情况。即使那样,您也应该尝试仅使用某些STL集合。如果您合法地需要内存管理(您尚未真正提供任何证据),则应该通过构造函数将内存管理封装在一个类中以分配内存,而通过析构函数来取消分配内存。从长远来看,您对做事方式要容易得多的回答并不是真的。首先,一旦您对C ++有深刻的了解,使此类构造函数成为第二自然。就我个人而言,我发现使用构造函数比使用清理代码更容易,因为我不需要仔细注意以确保我正确地进行了分配。取而代之的是,我可以让对象离开范围,而语言则由我自己处理。而且,维护它们比维护清理部分要容易得多,并且不容易出现问题。简而言之,goto在某些情况下可能是一个不错的选择,但在这种情况下则不是。这只是短期的懒惰。
打开App,查看更多内容
随时随地看视频慕课网APP