Привет, Котаны!
Есть такой код:
func1()
{
int __result_=SUCCESS;
char *buff=malloc(5);
char *buff1=malloc(5);
int i;
for(i=0;i<5;i++)
{
int j;
for(j=0;j<5;j++)
{
if((__result_=func())!=SUCCESS)
goto __release_;
}
}
__release_:
free(buff);
free(buff2);
return __result_;
}
Чего хочу:так как есть еще с десяток подобных функций, и в каждой из них присутствуют либо вложенные циклы, либо вложенные выражения switch-case, то хочу обрабатывать ошибки автоматизированно. Что я под этим подразумеваю:
#define RETINIT __result_=SUCCESS
#define CHECK(X) if(__result_=X)!=SUCCESS) goto __release_
#define RETURN(X) __release_: X return __result_
Тогда получится:
func1()
{
RETINIT;
char *buff=malloc(5);
char *buff1=malloc(5);
int i;
for(i=0;i<5;i++)
{
int j;
for(j=0;j<5;j++)
{
CHECK(func());
}
}
RETURN(
{
free(buff);
free(buff2);
});
}
Но есть проблема. Как вы догадались, этот код использовать нельзя. Кто догадался - молодец, кто не догадался - объясняю: если этот код использовать в десяти функциях, то при выполнении посылать нас будет на первый goto - краш стэка, очистка неизвестно чего... Последствия понятны.
Как решать?