Expressions and statements
ES.76
Избегайте `goto`
Причина
Читаемость, предотвращение ошибок. Для людей существуют лучшие управляющие структуры; goto предназначен для машинно-генерируемого кода.
Исключение
Выход из вложенного цикла. В таком случае всегда выполняйте переход вперёд.
for (int i = 0; i < imax; ++i)
for (int j = 0; j < jmax; ++j) {
if (a[i][j] > elem_max) goto finished;
// ...
}
finished:
// ...
Пример (плохой)
Широко распространён идиом выхода в стиле C через goto:
void f()
{
// ...
goto exit;
// ...
goto exit;
// ...
exit:
// ... общий код очистки ...
}
Это самодельная симуляция деструкторов. Объявляйте ресурсы с дескрипторами, имеющими деструкторы для очистки. Если по какой-то причине нельзя выполнить всю очистку через деструкторы используемых переменных, рассмотрите gsl::finally() как более чистую и надёжную альтернативу goto exit.
Контроль
- Отмечать
goto. Ещё лучше — отмечать всеgoto, которые не выполняют переход из вложенного цикла к оператору сразу после гнезда циклов.