问题描述
标准中有 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()
,并且它的行为方式与程序的任何其他函数相同。