exit
的手册页说,
stdio
流。由tmpfile
创建的文件将被删除。exit
的参数,即EXIT_SUCCESS
和EXIT_FAILURE
比使用0和某些非零值(如1或-1)更具可移植性(对于非UNIX环境)。特别是,VMS使用不同的约定。 fcloseall
的手册页说,
stdin
,stdout
和stderr
也已关闭。fcloseall
函数不会锁定流,因此它不是线程安全的。许多在线教程都说取消分配"所有"给定类型的资源是编程错误。它们应该由拥有或不拥有它们的代码单独解除分配。
使用exit
代替fcloseall
是否合适?
答案 0 :(得分:9)
简短回答:是的,exit()
更好。
答案很长:
这取决于您设计程序的方式。通常最好让每个组件自行清理,删除任何临时文件和刷新缓冲区 - 这对于对象析构函数可以处理此问题的C ++程序尤为常见。
在这种情况下,您既不会使用exit()
也不会使用fcloseall()
- 您可以自行清理组件,然后只需return
main()
清空组件。
对于C程序,您可能更愿意设计它,期望在退出时通过其中一个功能自动清理所有内容。如果你正在考虑使用其中任何一个,那么exit()
是一个更安全的赌注,因为它会做更多:它将执行fcloseall()
所做的事情, plus 它将删除用{创建的临时文件{1}}。
此外,tmpfile()
是GNU扩展,可能会影响程序的可移植性。
也许更重要的是,这些功能有不同的用途。
fcloseall()
的目的是结束你的计划。
exit()
的目的是冲洗&关闭文件描述符,但不是为了结束你的程序。当你想要确保在调用fcloseall()
以启动另一个进程之前关闭所有文件(包括stdin / stdout / stderr)时,它可能是最有用的,而不会将任何文件描述符泄漏到它不会期望的新进程中。永远不会关闭。
答案 1 :(得分:6)
fcloseall
函数是GNU扩展。使用它会降低程序的可移植性。
exit
功能会关闭并刷新所有stdio流 - 但它也会终止您的程序,fcloseall
不会这样做,所以它几乎不能替代。
如果程序将继续执行,调用fcloseall
可能没有意义,如果它即将终止,exit
也会做同样的事情。
标准流stdin
,stdout
和stderr
通常不需要明确关闭。当程序终止时,让系统为您关闭它们是完全正确的。如果您已打开任何其他信息流,例如拨打fopen
,则应自行跟踪每个此类信息流,并在完成后立即将其关闭。