【问题标题】:What happens if return EXIT_FAILURE without using fclose()?如果不使用 fclose() 返回 EXIT_FAILURE 会发生什么?
【发布时间】:2020-07-06 15:26:31
【问题描述】:

假设我使用 fopen 并认为文件格式对我的程序无效或指针为 NULL。当我到达那种情况而不使用 fclose 时简单地返回 EXIT_FAILURE 会有什么后果?

【问题讨论】:

  • main返回相当于调用exit。所做的一些事情是用未写入的数据刷新流,关闭所有流,并删除使用tmpfile 创建的所有文件。

标签: c file io fclose


【解决方案1】:

当文件指针为 NULL 或您将文件格式编码为无效时,简单地返回 EXIT_FAILURE 不会有任何后果。这将是带有 EXIT_FAILURE 返回值的程序的简单退出。虽然您可以在需要时使用atexit() 函数在退出时清理资源。

【讨论】:

    【解决方案2】:

    EXIT_FAILURE 是在stdlib.h 库中定义的宏,它扩展为1。另一方面,宏 EXIT_SUCCESS 常量扩展为 0。在我们的一般约定中,将0 返回到主函数表明代码运行成功,否则错误退出。

    此外,为了刷新流和撤消操作,atexit() 将完成这项工作。

    请注意,我们将在全局范围内使用x,因为要在atexit() 中作为参数传递的函数不能在其中传递任何内容。 atexit()根据C++ Reference (using C declaration)的函数签名如下:

    int atexit (void (*func)(void));
    

    让我们假设以下程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    // will be used for atexit()
    void exit_stuffs(void);
    
    // to use return code
    int x;
    
    int main(void) {
        int a = 4;
    
        x = (a < 5) ? EXIT_FAILURE : EXIT_SUCCESS;
    
        atexit(&exit_stuffs);
        
        return x;
    }
    
    void exit_stuffs(void) {
        printf("The return code was: %d\n", x);
    }
    

    这会将EXIT_FAILURE 分配给x,然后返回x。在程序的退出处,还给出了一个使用atexit()的例子。

    【讨论】:

      【解决方案3】:

      当我到达那种情况而不使用 fclose 时简单地返回 EXIT_FAILURE 会有什么后果?

      无,有一个例外:如果您正在写入文件,那么一些数据将会丢失。差不多就是这样,返回什么都没关系 - EXIT_FAILURE 在典型的操作系统上绝不是特殊的。

      【讨论】:

        猜你喜欢
        • 2011-12-31
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 2019-10-07
        • 2023-04-05
        • 2016-01-22
        相关资源
        最近更新 更多