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

sas*_*hka 10 c c++ stdout flush autoflush

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

#include <stdio.h>

int main() {
    printf("asfd");
    // LINE 1
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

但是为什么上面的代码打印"asdf"并且在没有缓冲区的情况下不会被刷新?什么是引擎盖下的,为什么它按预期工作?

Ray*_*hen 18

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

[basic.start.main]

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

和

[lib.support.start.term]

该功能exit在本国际标准中有其他行为:

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

  • @ sasha.sochka:你不能重载`exit`函数; 如果你尝试,你的功能将不会被调用.但是,您可以使用[`atexit(3)`](http://linux.die.net/man/3/atexit)函数注册要在退出时调用的函数. (4认同)
  • 如果你真的想知道底层发生了什么,请使用调试器并跳出`main`函数,看看它的位置! (3认同)
  • 它的具体实现方式在每个平台上都不同。尽管如此,规范对于执行“main”函数之前和之后要执行的步骤非常清楚,并且(最后对我来说)足以很好地概述幕后发生的情况。 (2认同)