Иногда код, который вы показываете, действительно является наилучшим доступным вариантом, но вот некоторые альтернативы.
Часто вместо этого вы можете структурировать свой код следующим образом:
if (action_1() failed) {
report error;
return -1;
}
if (action_2() failed) {
report error;
return -1;
}
/* etc */
Эта конструкция объясняет, почемуЭто обычная идиома C для возврата 0 в случае успеха или -1 в случае неудачи: она позволяет записать if (action_1() failed)
как просто if (action_1())
.
Если вам нужно выполнить некоторую очистку перед возвратом и очисткудействия аккуратны, это еще одна возможность:
if (action_1()) {
report error;
goto fail_a1;
}
if (action_2()) {
report error;
goto fail_a2;
}
if (action_3()) {
report error;
goto fail_a3;
}
/* etc */
return 0;
/* errors */
/* etc */
fail_a3:
clean up from a2;
fail_a2:
clean up from a1;
fail_a1:
return -1;
Настоящим вам разрешается использовать goto
для этого.