在退出之前是否保证stdout自动刷新?它是如何工作的?

时间:2013-04-09 20:08:27

标签: c++ c stdout flush autoflush

这是代码(有效的C和C ++)

#include <stdio.h>

int main() {
    printf("asfd");
    // LINE 1
    return 0;
}

如果在第1行我放了segfaulting表达式,程序就会崩溃而不打印任何东西(如预期的那样)。

但是为什么上面的代码打印“asdf”并且没有刷新缓冲区就不会退出?什么是幕后的,为什么它按预期工作?

3 个答案:

答案 0 :(得分:18)

这是通过C ++语言规范中的这两节来完成的:

  

<强> [basic.start.main]

     

main中的return语句具有离开main函数并以返回值作为参数调用exit的效果。

  

<强> [lib.support.start.term]

     

函数exit在本国际标准中有其他行为:

     
      
  • ...
  •   
  • 接下来,刷新所有带有未写入缓冲数据的开放C流。
  •   
  • ...
  •   

答案 1 :(得分:3)

通常,main的退货不是您的计划的结束,也不是main的开始。

通常,为程序创建最终可执行文件的链接器会将某个位置(可能名为start)标记为执行开始的位置。当操作系统加载程序并开始执行它时,它将在此处开始执行。那里有代码来设置环境:创建堆栈,设置流状态等等。然后,此代码调用main

main返回时,它将返回此特殊代码。然后,该代码执行C或C ++程序结束时所需的各种清理工作,如this answer中所述。

如果程序突然终止,则可能不会执行此最终代码。

答案 2 :(得分:1)

main()退出时,所有打开的流都会关闭...以包含stdout。关闭打开的流将刷新stdout,并且无论是否使用换行符,都会将您写入缓冲区的内容提交。