В настоящее время я работаю над проектом, в котором успешно используются инструкции goto. Основная цель операторов goto состоит в том, чтобы иметь один раздел очистки в подпрограмме, а не в нескольких операторах return. Как ниже:
BOOL foo()
{
BOOL bRetVal = FALSE;
int *p = NULL;
p = new int;
if (p == NULL)
{
cout<<" OOM \n";
goto Exit;
}
// Lot of code...
Exit:
if(p)
{
delete p;
p = NULL;
}
return bRetVal;
}
Это упрощает процесс отслеживания нашего кода очистки в одном разделе кода, то есть после метки Exit.
Тем не менее, я прочитал много мест, в которых плохая практика имеет инструкции goto.
В настоящее время я читаю Code Complete, и он говорит, что нам нужно использовать переменные, близкие к их объявлениям. Если мы используем goto, тогда нам нужно объявить/инициализировать все переменные перед первым использованием goto, иначе компилятор даст ошибки, которые инициализация переменной xx пропускается с помощью инструкции goto.
Какой путь прав?
Из комментария Скотта:
Похоже, что использование goto для перехода из одной секции в другую плохо, поскольку это делает код трудным для чтения и понимания.
Но если мы используем goto только для продвижения вперед и к одной метке, тогда это должно быть хорошо (?).