Я знаю, что меня за это линчуют, но у меня был друг, который сказал, что они использовали goto
для этого.
Затем он сказал мне, что в большинстве случаев этого было недостаточно, и теперь он использовал setjmp()
/ longjmp()
. По сути, он заново изобрел исключения в C ++, но с гораздо меньшей элегантностью.
Тем не менее, поскольку goto
может работать, вы можете преобразовать его в нечто, что не использует goto
, но отступ быстро выйдет из-под контроля:
char* function() {
char* result = NULL;
char* mem = get_memory(100);
if(mem) {
struct binder* b = get_binder('regular binder');
if(b) {
struct file* f = mk_file();
if (f) {
// ...
}
free(b);
}
free(mem);
}
return result;
}
Кстати, рассеяние объявлений локальной переменной вокруг блока, как это не является стандартным C.
Теперь, если вы понимаете, что free(NULL);
определяется стандартом C как ничего не делающего, вы можете упростить вложение некоторых:
char* function() {
char* result = NULL;
char* mem = get_memory(100);
struct binder* b = get_binder('regular binder');
struct file* f = mk_file();
if (mem && b && f) {
// ...
}
free(f);
free(b);
free(mem);
return result;
}