Считается ли GOTO безвредным при переходе к очистке в конце функции?

Оператор 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 .

20
задан user694733 4 December 2018 в 09:45
поделиться