【发布时间】:2020-11-28 06:05:16
【问题描述】:
您好,我想知道从 main 函数返回和退出的区别是什么。当它们中的每一个被调用时,幕后会发生什么,以及在每种情况下如何返回控件。 如果有人能深入研究这个主题,我会非常感激。
【问题讨论】:
-
exit()的重点在于,您可以从嵌套函数中调用它,而不仅仅是从main。在功能上它们是等价的。 -
当您调用 exit 或返回调用
main的 CRT 启动代码时,C 库执行的详细信息显然取决于操作系统和 C 库。 (一般来说,它当然必须实现所有 ISO C 要求,例如刷新 stdio 缓冲区和运行 atexit 函数)。我认为通常main的调用者会做与exit(main(argc, argv))等效的事情,所以无论哪种方式都会发生同样的事情。如果您正在某个特定平台上寻找 asm 详细信息,请在您的问题中说出哪一个。 (或 main 之外的单步 asm 指令)。 -
作为理解 CRT 启动代码的一部分,对于 GNU/Linux,请参阅 Linux x86 Program Start Up or - How the heck do we get to main()?。它提到
__libc_start_main使用main 的返回值调用exit。由于这个问题并非特定于任何一组 C 实现,但我不能真正将其发布为答案。你不会得到比 rici 关于实现通常如何做的答案更具体的答案。