什么goto语句,你认为可以接受的使用?我正在讨论一些关于C嵌入式工作的编码指南,并想知道是否存在goto是最干净的方式来做事情的情况。
回答
对于C语言,我发现在某些函数中使用goto作为常用的退出点很有用。如果你需要在返回之前释放资源,那么很好做retval = -ERROR; goto fn_exit;
而不是试图摆脱多层for/while循环。
有些人会认为在设计良好的代码中没有必要 - 当您达到使用goto的吸引力时,您应该将功能分解为多个子功能。也许在某些情况下这是真的,但是如果你必须传入多个变量,或者传递指向变量的指针,以便子函数可以更新这些值,我觉得你已经增加了不必要的复杂性。
以下是using goto for error management最近的SO问题。我确定浏览goto tag会给你更多的答案。
我发现有很多地方goto可能会简化逻辑。我的规则是没有两个goto重叠,goto和它的标签是'close';通常不超过30线。
通常,当我有一个复杂的条件是我要检查很多东西,goto语句可能会帮助:
if (condition1 && cond2)
if (checkFile(file))
goto DONE;
else
if (condition3)
goto DONE;
handleError();
return 0;
DONE:
...do something...
return 1;
我可以想到更优雅的解决方案*没有* goto,所以这不是一个强有力的论点。例如,创建一个函数'int done()',并用'return done()'替换'goto DONE'。几乎总是有一种比诉诸goto更好的方法。 – Clifford 2010-06-03 16:51:59
@Clifford你是对的,我上面的例子很简单;但这是关键:我提出的goto的使用是针对复杂的逻辑,这很难通过一个简单的例子来演示。现在,在一些复杂的问题中,我发现一个简单的goto比其他解决方案的意图更直接和明确。 – Gianni 2010-06-03 17:07:32
@Clifford你是否在给定的函数中提出了多个return语句? – simon 2010-06-04 00:18:22
我个人的看法是,有goto语句没有可接受的使用在现代编程语言。
Edsger W. Dijkstra所着的“GOTO声明被认为是有害的”,在解决这个问题方面做得很好。该文件应该被要求阅读这个星球上的每个软件开发者。
值得注意的是,20世纪70年代晚期UT奥斯汀Don Good小组的Gypsy语言并没有启动。
值得注意的是,Ichbiah等人仅在Ada中包含了一个goto,因为DoD明确要求它在需求规范中的许多单词中。我记得伊奇比和他的团队故意将goto目标标签的语法尽可能地丑化,使标签像拇指一样突出,并劝阻使用goto。
- 1. java中goto的用途
- 2. 什么是可接受的ViewState大小
- 3. `$ .support.ownLast`的用途是什么?
- 4. TPopupActionBar的用途是什么?
- 5. _GLOBAL__I_的用途是什么?
- 6. $ _POST的用途是什么?
- 7. “$ this”的用途是什么?
- 8. CreateSilverlight.js的用途是什么?
- 9. vertexAttribPointer的用途是什么?
- 10. RecognizerIntent.DETAILS_META_DATA的用途是什么?
- 11. Rake的用途是什么?
- 12. javax.security.auth.callback。*的用途是什么?
- 13. config.assets.precompile的用途是什么?
- 14. is_uploaded_file()的用途是什么?
- 15. archetypeArtifactId的用途是什么?
- 16. System.Data.SqlClient.SqlParameter.IsNullable的用途是什么?
- 17. com.sun.org.apache.xpath.internal.operations.String的用途是什么?
- 18. FXCollections.unmodifiableObservableList的用途是什么?
- 19. __init__的用途是什么?
- 20. __cxa_pure_virtual的用途是什么?
- 21. cURL的用途是什么?
- 22. RhoMobile的用途是什么?
- 23. curdoc()的用途是什么?
- 24. configSections的用途是什么?
- 25. RegisterGlobalFilters的用途是什么?
- 26. PhoneGap的用途是什么?
- 27. gulp.src的用途是什么?
- 28. AtomicReferenceArray的用途是什么?
- 29. __name__的用途是什么?
- 30. RegisterFmxClasses的用途是什么?
关于这个问题的一个有趣的阅读是D. D. Knuth的[结构化程序设计与语句](http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf)。它写在1974年,但仍然包含有趣的例子和想法 – tonio 2010-06-03 16:20:03