非启动时 运行 时 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()
,它的行为方式与程序的任何其他函数相同。
标准中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 theexit
function with the value returned by the main function as its argument; reaching the}
that terminates the main function returns a value of0
. 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()
,它的行为方式与程序的任何其他函数相同。