2010-06-03 99 views
1

可能重复:
Examples of good gotos in C or C++goto的可接受用途是什么?

什么goto语句,你认为可以接受的使用?我正在讨论一些关于C嵌入式工作的编码指南,并想知道是否存在goto是最干净的方式来做事情的情况。

+0

关于这个问题的一个有趣的阅读是D. D. Knuth的[结构化程序设计与语句](http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf)。它写在1974年,但仍然包含有趣的例子和想法 – tonio 2010-06-03 16:20:03

回答

1

对于C语言,我发现在某些函数中使用goto作为常用的退出点很有用。如果你需要在返回之前释放资源,那么很好做retval = -ERROR; goto fn_exit;而不是试图摆脱多层for/while循环。

有些人会认为在设计良好的代码中没有必要 - 当您达到使用goto的吸引力时,您应该将功能分解为多个子功能。也许在某些情况下这是真的,但是如果你必须传入多个变量,或者传递指向变量的指针,以便子函数可以更新这些值,我觉得你已经增加了不必要的复杂性。

以下是using goto for error management最近的SO问题。我确定浏览goto tag会给你更多的答案。

0

我发现有很多地方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; 
+0

我可以想到更优雅的解决方案*没有* goto,所以这不是一个强有力的论点。例如,创建一个函数'int done()',并用'return done()'替换'goto DONE'。几乎总是有一种比诉诸goto更好的方法。 – Clifford 2010-06-03 16:51:59

+0

@Clifford你是对的,我上面的例子很简单;但这是关键:我提出的goto的使用是针对复杂的逻辑,这很难通过一个简单的例子来演示。现在,在一些复杂的问题中,我发现一个简单的goto比其他解决方案的意图更直接和明确。 – Gianni 2010-06-03 17:07:32

+0

@Clifford你是否在给定的函数中提出了多个return语句? – simon 2010-06-04 00:18:22

0

我个人的看法是,有goto语句没有可接受的使用在现代编程语言。

Edsger W. Dijkstra所着的“GOTO声明被认为是有害的”,在解决这个问题方面做得很好。该文件应该被要求阅读这个星球上的每个软件开发者。

值得注意的是,20世纪70年代晚期UT奥斯汀Don Good小组的Gypsy语言并没有启动。

值得注意的是,Ichbiah等人仅在Ada中包含了一个goto,因为DoD明确要求它在需求规范中的许多单词中。我记得伊奇比和他的团队故意将goto目标标签的语法尽可能地丑化,使标签像拇指一样突出,并劝阻使用goto。