Оператор goto
подробно исследовался в нескольких обсуждениях SO (см. this и that ), и я, конечно, не хочу возобновлять эти горячие споры.
Вместо этого я хотел бы сосредоточиться на единственном варианте использования goto
s и обсудить его значение и возможные альтернативы.
Рассмотрим следующий фрагмент кода, что является обычным явлением (по крайней мере, в моем собственном) автоматах:
while (state = next_state()) {
switch (state) {
case foo:
/* handle foo, and finally: */
if (error) goto cleanup;
break;
case bar:
/* handle bar, and finally: */
if (error) goto cleanup;
break;
/* ...other cases... */
}
}
return ok;
cleanup:
/* do some cleanup, i.e. free() local heap requests, adjust global state, and then: */
return error;
Замена материала очистки в отдельной функции только для того, чтобы сохранить goto
, кажется неудобной. С другой стороны, нас воспитали осуждать использование goto
везде, где это возможно.
Мой вопрос: считается ли мой пример кода хорошим стилем?
Если нет, то есть ли возможные альтернативы?
Пожалуйста, придерживайтесь специфического использования goto
, описанного выше. Я не хочу углубляться в еще одну дискуссию об общем использовании goto
.