С этим комментарием я не поощряю использование GOTO, но просто хочу подчеркнуть, что в некоторых очень специфических случаях это может быть полезно. До сих пор на практике я не видел ни одного кода, который использует операторы goto
для перемещения вверх или вниз, но есть один конкретный случай использования, где я считаю goto
более читабельным. Вот пример кода, где я думаю, что goto
имеет больше смысла.
void fun_test ()
{
.code..
allocate dynamic memory.
acquire_lock();
//do some action, call api.
if (some error) {
print error;
free memory;
unlock();
return FAIL;
} else {
// some code.
}
if (some_other error) {
print error;
free memory;
unlock();
return FAIL;
}
:
:
// more error condition checks.
:
return SUCCESS
}
void fun_test_withgoto ()
{
error_code rc = SUCCESS;
.code..
allocate dynamic memory.
acquire_lock();
//do some action, call api.
if (some error) {
rc = <Failure id>;
goto function_cleanup;
} else {
// some code.
}
if (some_other error) {
rc = <failure id>;
goto function_cleanup;
}
:
:
// more error conditions.
:
function_cleanup:
if (rc == SUCCESS) {
print "Success..";
} else {
print "Error : <failure id>";
}
free_memory();
unlock();
return(rc);
}