确实允许从自身调用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;
}
当以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'
但是,由于这只是轶事证据,我们应该转向标准。 ISO C11 部分4 Conformance 声明:
1/ 在本国际标准中,“应”被解释为对实现或程序的要求;相反,“shall not”将被解释为禁止。
2/ 如果违反了出现在约束或运行时约束之外的“应”或“不应”要求,则行为未定义。未定义的行为在本国际标准中以“未定义的行为”一词或省略任何明确的行为定义来表示。这三者在重点上没有区别;它们都描述了“未定义的行为”。
3/ 在所有其他方面都正确的程序,对正确的数据进行操作,包含未指定的行为,应是正确的程序,并按照 5.1.2.3 行事。
现在,由于main() 调用自身的标准中的任何地方都没有明确的禁止,因此上面的第 3 条是控制方面。
在两个地方可以看到进一步的支持(我的粗体),首先在5.1.2.2.3 Program termination部分:
1/ 如果main 函数的返回类型是与int 兼容的类型,则initial 调用返回main 函数相当于以main函数返回的值作为参数调用exit函数;
然后在7.21.3 Files部分:
5/ 该文件可能随后被相同或另一个程序执行重新打开,并且其内容被回收或修改(如果它可以在其开始时重新定位)。如果main 函数返回到它的原始 调用者,或者如果exit 函数被调用,所有打开的文件都被关闭(因此所有输出流都被刷新)之前程序终止。
这两个小节都支持在初始/原始调用之外其他调用main()的可能性。