pax*_*blo 13
确实允许main()
从自身调用,甚至避免使用与任何其他递归代码相同的方法的堆栈溢出,终止条件,例如:
#include <stdio.h>
int main (int argc, char *argv[]) {
printf ("Running main with argc = %d, last = '%s'\n",
argc, argv[argc-1]);
if (argc > 1)
return main(argc - 1, argv);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当运行时testprog 1 2 3
,输出:
Running main with argc = 4, last = '3'
Running main with argc = 3, last = '2'
Running main with argc = 2, last = '1'
Running main with argc = 1, last = 'testprog'
Run Code Online (Sandbox Code Playgroud)
但是,由于这只是轶事证据,我们应该转向标准.ISO C11部分4 Conformance
规定:
1 /在本国际标准中,"应"应被解释为对实施或计划的要求; 相反,"不得"应被解释为禁止.
2 /如果违反了约束或运行时约束之外出现的"应该"或"不应该"的要求,则行为是不确定的.未定义的行为在本国际标准中以"未定义的行为"或省略任何明确的行为定义来表示.这三者之间的重点没有区别; 他们都描述了"未定义的行为".
3 /在所有其他方面都正确的程序,对正确的数据进行操作,包含未指明的行为,应该是正确的程序,并按照5.1.2.3行事.
现在,由于标准中的任何地方都没有明确禁止main()
自称,上面的第3条是控制方面.
可以在两个地方看到进一步的支持(我的大胆),第一部分5.1.2.2.3 Program termination
:
1 /如果
main
函数的返回类型是兼容的类型int
,则从初始调用main
函数返回到函数等效于调用exit
函数返回的main
函数作为其参数;
然后在部分7.21.3 Files
:
5 /该文件可以随后通过相同或另一个程序执行重新打开,并且其内容被回收或修改(如果它可以在其开始时重新定位).如果
main
函数返回其原始调用者,或者调用该exit
函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流).
这两个子部分都支持可能有其他调用main()
超过初始/原始调用的可能性.
是的,我们可以在main()函数中调用main().
函数本身调用函数的过程称为递归.
好吧,你可以在main()函数中调用main(),但是你应该有一个不调用main()函数来终止程序的条件.
否则,程序永远不会返回并无限运行.