我认为以下代码是正常的(与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;
}

我们可以看到fclose(fp)在代码中出现了两次。如果在foo函数中还有其他return语句,它将显示更多。但是,麻烦的是我必须多次编写fclose(fp)。一种解决方案只是一种功能的一种回报。但是,多次返回有时很有用。还有其他解决方案吗?

PS:据我所知,在Lisp中有一个宏(带有打开文件)。
(with-open-file (stream-var open-argument*)
    body-form*)

它可以为我们打开和关闭文件。

最佳答案

在linux内核的源代码中,有许多函数必须在返回时处理锁和其他资源。而且,它们通常会在函数的末尾添加一个清理标签,并在每当发生早期返回时在其中添加goto。我个人建议使用这种用法以避免重复的代码,也许这是goto的唯一合理用法。

关于c - 如何确保malloc/free fopen/fclose匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6338787/

10-11 23:12
查看更多