1

可能重复:
C 或 C++ 中好的 goto 示例

您认为 goto 语句的哪些用途可以接受?我正在讨论 C 嵌入式工作的一些编码指南,并想知道在某些情况下 goto 是最干净的做事方式。

4

3 回答 3

1

对于 C,我发现在某些函数中使用 goto 作为通用退出点很有用。如果您需要在返回之前释放资源,最好不要retval = -ERROR; goto fn_exit;尝试跳出多层 for/while 循环。

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

这是最近关于使用 goto 进行错误管理的 SO 问题。我相信浏览goto 标签会给你更多的答案。

于 2010-06-03T16:20:31.743 回答
0

我发现 goto 可以在很多地方简化逻辑。我的规则是没有 2 个 goto 相互重叠,并且 goto 及其标签是“接近”的;通常,相隔不超过 30 行。

通常,当我遇到需要检查很多事情的复杂情况时,goto 可能会有所帮助:

if ( condition1 && cond2 )
  if ( checkFile( file ) )
    goto DONE;
else
  if ( condition3 )
    goto DONE;

handleError();
return 0;

DONE:
...do something...
return 1;
于 2010-06-03T16:20:40.933 回答
-2

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

已故 Edsger W. Dijkstra 的“GOTO 声明被认为是有害的”很好地解决了这个问题。地球上的每个软件开发人员都应该阅读该论文。

值得注意的是,1970 年代后期来自 UT Austin 的 Don Good 小组的吉普赛语没有 goto。

值得注意的是,Ichbiah 等人在 Ada 中只包含了一个 goto,因为 DoD 明确要求它,在需求规范中有很多字眼。我记得读过 Ichbiah 和他的团队故意使 goto 目标标签语法尽可能丑陋,以使标签像拇指酸痛一样突出,并阻止使用 goto。

于 2010-06-03T16:21:17.390 回答