Здравствуйте, postmaster, Вы писали:
P>В свете дискуссии здесьАвтор: Maxim S. Shatskih
Дата: 11.06.04
возник интересный вопрос: как вы оформляете код на plain C, который проверяет возвращаемый код из цепочки вызываемых функций?
P>Я в своей практике встречал следующие варианты:
еще один вариант — "липовый" do {}while(0);
int f()
{
int failed;
void *obj1=NULL;
void *obj2=NULL;
do {
if (!(failed=construct_obj1(&obj1)))
break;
if (!(failed=construct_obj2(&obj2)))
break;
failed=do_something(obj1,obj2);
} while(false);
if (obj1!=NULL)
destruct_obj1(obj1);
if (obj2!=NULL)
destruct_obj2(obj1);
return failed;
}
плюсы :
+ в любом месте можно выйти из него простым break не заботясь о вызове деструкторов
+ все деструкторы вызываются в одном месте
+ несмотря на похожесть на вариант с goto тут нет меток
+ внутри do {} while() можно завести какой локальный объект внутри тела блока.
минусы :
— кому то может показаться что do {} while() используется не по делу)
— код все таки уползает вправо хотя и медленно.
— проверки на NULL режут глаз