非启动时 运行 时 main() 函数的规则与启动时相同?

Rules of main() function when running at non-startup are the same as at startup?

标准中main()函数有一些规则。
如果函数由 OS、
调用 argc的值是非负的,
return 值默认为 0,等等

另一方面,main()可以被其他函数调用,
因此意味着 main().

的递归执行

在这种情况下,如果main()被另一个函数调用,
return 值默认为 0 是否仍然正确,
或者 argc 必须是非负数?

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

“仅调用 main 的最外层”或其他任何东西都没有特殊情况。

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

C11标准报价5.1.2.2.3/1:

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. If the return type is not compatible with int, the termination status returned to the host environment is unspecified.

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

同样,在第 5.1.2.2.3 条(程序终止)中可以找到 main 的 return 规则的放宽。为了使这一点更清楚,文本指出这仅涉及对 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() 函数 未被 OS 调用 。 OS 在内存中加载可执行文件并将控制权交给一段代码:

  • 准备 main() 的参数并调用它;
  • 获取由 main() 编辑的值 return 并使用特定于 OS 的机制将其传递回 OS; 当 main() 没有 return 任何东西时,它使用 0 作为默认值;
  • 做其他与讨论无关的事情。

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

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

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