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