非启动运行时main()函数的规则和启动时一样吗?

问题描述

标准中有 main() 函数的一些规则。
如果该函数被操作系统调用
argc 的值为非负,
返回值认为0等

另一方面,main()可以被其他函数调用
因此意味着 main() 的递归执行。

在这种情况下,如果main()被另一个函数调用
返回值认为0还是真的吗,
或者 argc 必须是非负数?

解决方法

关于 return 语句的规则是,如果执行到 main 的末尾而没有遇到 return 语句,那么它的行为就好像 return 0; 存在一样。

“仅对 main 的最外层调用”或任何其他内容没有特殊情况。

当然可以使用不同的参数值递归调用 main -- 显然,如果您在程序中执行此操作,那么您将需要在 main 中以这样的方式编写代码以明确定义的方式处理。

C11 标准报价 5.1.2.2.3/1:

如果main函数的返回类型是兼容int的类型,那么从初始调用main函数返回相当于用main函数返回的值调用exit函数函数作为其参数;到达终止主函数的 } 返回值 0。如果返回类型与 int 不兼容,则返回给宿主环境的终止状态是未指定的。

,

正如其他人已经说过的,对 argc 没有限制。这些要求在第 5.1.2.2.1 条(程序启动)中表达,因此它们只涉及最初调用 main 的参数。

类似地,在第 5.1.2.2.3 节(程序终止)中可以找到对 main 返回规则的放宽。为了更清楚地说明这一点,文本指出这仅涉及对 main 的初始调用。正文是

If the return type of the `main` function is a type
compatible with `int`,a return from the initial call
to the `main` function is equivalent to calling the `exit`
function with the value returned by the main
function as its argument; reaching the `}` that terminates 
the `main` function returns a value of `0`.

“;”短语内清楚地暗示短语开头的条件对最后一个子短语仍然有效。

所有这些仅在 5.1.2.2(托管环境)中有效,因此独立环境可能会发明自己的规则,但 C 标准并未涵盖这些规则。

,

main() 函数不会被操作系统调用。操作系统在内存中加载可执行文件并控制一段代码:

  • 准备main()的参数并调用它;
  • 获取main()返回的值,并使用特定于操作系统的机制将其传递回操作系统; 当 0 不返回任何内容时,它使用 main() 作为默认值;
  • 做其他与讨论无关的事情。

这段代码属于您的程序,由标准 C 库提供。

main() 只是一个普通的函数,除了名字之外没有什么特别之处。例如,Windows 可执行文件出于相同目的使用函数 WinMain() 而不是 main()

您可以像调用程序的任何其他函数一样调用 main(),并且它的行为方式与程序的任何其他函数相同。