【发布时间】:2020-07-06 15:26:31
【问题描述】:
假设我使用 fopen 并认为文件格式对我的程序无效或指针为 NULL。当我到达那种情况而不使用 fclose 时简单地返回 EXIT_FAILURE 会有什么后果?
【问题讨论】:
-
从
main返回相当于调用exit。所做的一些事情是用未写入的数据刷新流,关闭所有流,并删除使用tmpfile创建的所有文件。
假设我使用 fopen 并认为文件格式对我的程序无效或指针为 NULL。当我到达那种情况而不使用 fclose 时简单地返回 EXIT_FAILURE 会有什么后果?
【问题讨论】:
main返回相当于调用exit。所做的一些事情是用未写入的数据刷新流,关闭所有流,并删除使用tmpfile 创建的所有文件。
当文件指针为 NULL 或您将文件格式编码为无效时,简单地返回 EXIT_FAILURE 不会有任何后果。这将是带有 EXIT_FAILURE 返回值的程序的简单退出。虽然您可以在需要时使用atexit() 函数在退出时清理资源。
【讨论】:
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()的例子。
【讨论】:
当我到达那种情况而不使用 fclose 时简单地返回 EXIT_FAILURE 会有什么后果?
无,有一个例外:如果您正在写入文件,那么一些数据将会丢失。差不多就是这样,返回什么都没关系 - EXIT_FAILURE 在典型的操作系统上绝不是特殊的。
【讨论】: