Оператор goto
был подробно рассмотрен в нескольких обсуждениях SO (см. this и что), и я, конечно, не хочу оживлять эти горячие дебаты.
Вместо этого я хотел бы сосредоточиться на одном случае использования goto
и обсудить его значение и возможные альтернативы.
Рассмотрим следующий фрагмент кода, который является общим для (по крайней мере, моего) FSM:
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
.