为了账号安全,请及时绑定邮箱和手机立即绑定

是否使用GOTO?

是否使用GOTO?

C++
萧十郎 2019-12-27 15:18:07
目前,我正在一个项目中大量使用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前进并指向一个标签,则应该很好(?)。
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-12-27
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

人们对于gotos和您的代码基本上有两点:

  1. 后藤很糟糕。 在一个需要使用goto的地方遇到这种情况非常罕见,但是我不建议您完全打败它。尽管C ++具有足够智能的控制流程,但很少适合使用goto。

  2. 您的清理机制是错误的:这一点更为重要。在C语言中,自己使用内存管理不仅可以,而且通常是做事的最佳方法。在C ++中,您的目标应该是尽可能避免内存管理。您应该尽可能避免内存管理。让编译器为您完成。而不是使用new,而只是声明变量。真正需要内存管理的唯一时间是事先不知道数据大小的情况。即使那样,您也应该尝试仅使用某些STL集合。

如果您合法地需要内存管理(您尚未真正提供任何证据),则应该通过构造函数将内存管理封装在一个类中以分配内存,而通过析构函数来取消分配内存。

从长远来看,您对做事方式要容易得多的回答并不是真的。首先,一旦您对C ++有深刻的了解,使此类构造函数成为第二自然。就我个人而言,我发现使用构造函数比使用清理代码更容易,因为我不需要仔细注意以确保我正确地进行了分配。取而代之的是,我可以让对象离开范围,而语言则由我自己处理。而且,维护它们比维护清理部分要容易得多,并且不容易出现问题。

简而言之,goto在某些情况下可能是一个不错的选择,但在这种情况下则不是。这只是短期的懒惰。


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 463 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信