我认为以下代码是正常的(并且malloc/free类似):
int foo(){
FILE *fp = fopen("test.in", "r");
int i;
for(i = 0; i < NUM; i ++){
if(Match(fp, i)){
fclose(fp);
return i;
}
}
fclose(fp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到fclose(fp)在代码中出现两次.如果函数foo中有其他return语句,它会显得更多.但是,我必须写fclose(fp)很多次很麻烦.一种解决方案只是一个函数的一个返回.但是,多次返回有时是有用的.还有其他解决方案吗?
PS:据我所知,lisp中有一个宏(带有打开文件).
(with-open-file (stream-var open-argument*)
body-form*)
Run Code Online (Sandbox Code Playgroud)
它可以为我们打开和关闭文件.
使用break经常有助于:
int foo() {
FILE *fp = fopen("test.in", "r");
int i, result;
result = 0;
for(i = 0; i < NUM; i ++){
if(Match(fp, i)){
result = i;
break;
}
}
fclose(fp);
return result;
}
Run Code Online (Sandbox Code Playgroud)
在linux内核的源代码中,有很多函数需要在返回时处理锁和其他资源.它们通常会在函数末尾添加一个清理标签,并goto在每次早期返回时添加.我个人推荐这种用法以避免重复代码,也许这是唯一合理的用法goto.