这个问题实际上是不久前在Programming.reddit.com上interesting discussion分的结果.它基本上归结为以下代码:
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
似乎是最好的方法,可以产生所有可能的代码中最干净、最高效的代码,至少在我看来是这样.引用史蒂夫·麦康奈尔在《Code Complete》中的话:
GOTO在以下 routine 中很有用,该 routine 分配资源,执行 对这些资源的操作,以及 然后重新分配资源.使用一个 后藤,你可以在一段时间内打扫干净 代码的一部分.后藤降低了 你忘记的可能性 解除对每个地方的资源分配 您检测到错误.
对这种方法的另一个支持来自Linux Device Drivers本书"在this section个人中".
你认为如何?本例是C中goto
的有效用法吗?您是否更喜欢其他方法,它们会产生更复杂和/或效率更低的代码,但避免使用goto
?