Этот вопрос на самом деле является результатом интересного обсуждения на сайте 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
здесь, по-видимому, является лучшим способом, что приводит к самому чистому и эффективному коду всех возможностей или, по крайней мере, так мне кажется. Цитата: Стив Макконнелл в Code Complete:
Goo полезен в рутине, которая выделяет ресурсы, выполняет операции над этими ресурсами и затем освобождает ресурсы. С goto, вы можете очистить в одном разделе кода. Goo уменьшает вероятность того, что вы забудете освобождать ресурсы в каждом месте вы обнаружите ошибку.
Другая поддержка этого подхода взята из книги драйверов устройств Linux, в в этом разделе.
Как вы думаете? Является ли этот случай действительным использованием для goto
в C? Предпочитаете ли вы другие методы, которые производят более сложный и/или менее эффективный код, но избегайте goto
?