这个问题实际上是前段时间 programming.reddit.com 有趣的讨论的结果。它基本上可以归结为以下代码:
int foo(int bar)
{
int return_value = 0;
if (!do_something( bar )) {
goto error_1;
}
if (!init_stuff( bar )) {
goto error_2;
}
if (!prepare_stuff( bar )) {
goto error_3;
}
return_value = do_the_thing( bar );
error_3:
cleanup_3();
error_2:
cleanup_2();
error_1:
cleanup_1();
return return_value;
}
在这里使用 goto
似乎是最好的方法,产生了所有可能性中最干净和最有效的代码,或者至少在我看来是这样。引用史蒂夫 · 麦康奈尔在 代码完成中的话:
Goto 在日常工作中很有用 分配资源,执行 这些资源的运作,以及 然后释放资源 Goto 你可以在一个区域清理 的代码。后藤减少了 你忘记的可能性 释放每个地方的资源 你检测到一个错误。
这种方法的另一个支持来自 Linux 设备驱动程序书,在 这部分。
你觉得怎么样?这种情况是否是 C 语言中 goto
的有效用法?您是否更喜欢生成更复杂和/或效率更低但避免使用 goto
的其他方法?