我需要一些想法,试图让这个程序更具可读性。我认为这是关于设计师的问题,而不是其他问题。
我有两个循环:
for( ... ) {
//...
for(...) {
if(baa) {
goto outer;
}
//statements of 2-loop
}
//statements of 1-loop
}
它工作正常,如果baa
具有非零值,则跳转到outer
标签而不运行循环1和2的运行元素。但在return
之前,我需要做一些{ {1}}如果调用了free()
则调用独立:
goto outer
但如果我因为 if(a != NULL) free(a);
if(b != NULL) free(b);
而来到这里,则不会调用上述代码。
我需要做以下事情:
goto
是什么让这个函数像这样:
goto outer; //if normally exited from two-loops, go to outer anyway.
outer: {
if(a != NULL) free(a);
if(b != NULL) free(b);
return ret;
}
我希望这很清楚。提前谢谢。
答案 0 :(得分:3)
正常控制流忽略outer
标签,它仅用作goto
的目标,因此在循环后不需要它。此外,无需将标签后的语句分组为复合语句
char* foo(void) {
char *ret = NULL;
for( ... ) {
//...
for(...) {
if(baa) {
ret = tmp_result;
goto outer;
}
//some statements of 2-loop
}
//some statements of 1-loop
}
outer:
if(a != NULL) free(a);
if(b != NULL) free(b);
return ret;
}
完全相同(眼睛上的IMO更好)。