在错误处理时,有时候使用 goto 能够减少一些代码冗余,比如以下代码:
<pre>
typedef struct
{
void *buff1;
void *buff2;
void *buff3;
} foo;
int func(void)
{
foo *p = (foo *)malloc(sizeof(foo));
if (p == NULL)
return -1;
p->buff1 = malloc(10);
if (p->buff1 == NULL)
{
free(p);
return -1;
}
p->buff2 = malloc(10);
if (p->buff2 == NULL)
{
free(p->buff1);
free(p);
return -1;
}
p->buff3 = malloc(10);
if (p->buff3 == NULL)
{
free(p->buff2);
free(p->buff1);
free(p);
return -1;
}
/* do something. */
return 0;
}
</pre>
每次错误处理的代码都会递增,如果使用 goto,就可以这样:
<pre>
int func(void)
{
foo *p = (foo *)malloc(sizeof(foo));
if (p == NULL)
goto bad0;
p->buff1 = malloc(10);
if (p->buff1 == NULL)
goto bad1;
p->buff2 = malloc(10);
if (p->buff2 == NULL)
goto bad2;
p->buff3 = malloc(10);
if (p->buff3 == NULL)
goto bad3;
/* do something. */
return 0;
bad3:
free(p->buff2);
bad2:
free(p->buff1);
bad1:
free(p);
bad0:
return -1;
}
</pre>
用goto解决错误处理
最新推荐文章于 2022-05-18 20:02:34 发布