Заявление goto
было подробно рассмотрено в нескольких обсуждениях SO (см. , и , ), и я, конечно, не хочу возобновлять эти горячие дебаты.
Вместо этого я бы хотел сосредоточиться на одном случае использования goto
с и обсудить его значение и возможные альтернативы.
Рассмотрим следующий фрагмент кода, который часто встречается в (по крайней мере, в моих) автоматах:
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
s везде, где это возможно.
Мой вопрос: мой пример кода считается хорошим стилем?
Если нет, есть ли доступные альтернативы?
Пожалуйста, придерживайтесь специального использования goto
, описанного выше. Я не хочу углубляться в еще одно обсуждение общего использования goto
.