目前,我正在一个项目中大量使用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作为您逻辑的标准部分,那么事情就已经发生了。
红糖糍粑
TA贡献1815条经验 获得超6个赞
人们对于gotos和您的代码基本上有两点:
后藤很糟糕。 在一个需要使用goto的地方遇到这种情况非常罕见,但是我不建议您完全打败它。尽管C ++具有足够智能的控制流程,但很少适合使用goto。
您的清理机制是错误的:这一点更为重要。在C语言中,自己使用内存管理不仅可以,而且通常是做事的最佳方法。在C ++中,您的目标应该是尽可能避免内存管理。您应该尽可能避免内存管理。让编译器为您完成。而不是使用
new
,而只是声明变量。真正需要内存管理的唯一时间是事先不知道数据大小的情况。即使那样,您也应该尝试仅使用某些STL
集合。
如果您合法地需要内存管理(您尚未真正提供任何证据),则应该通过构造函数将内存管理封装在一个类中以分配内存,而通过析构函数来取消分配内存。
从长远来看,您对做事方式要容易得多的回答并不是真的。首先,一旦您对C ++有深刻的了解,使此类构造函数成为第二自然。就我个人而言,我发现使用构造函数比使用清理代码更容易,因为我不需要仔细注意以确保我正确地进行了分配。取而代之的是,我可以让对象离开范围,而语言则由我自己处理。而且,维护它们比维护清理部分要容易得多,并且不容易出现问题。
简而言之,goto
在某些情况下可能是一个不错的选择,但在这种情况下则不是。这只是短期的懒惰。
- 3 回答
- 0 关注
- 463 浏览
添加回答
举报
0/150
提交
取消