在c中的main()中调用main()

ana*_*ant 25 c

是否可以在c中main()main()函数内调用?

nos*_*nos 27

是的,C允许你调用你的main函数(而C++ 没有)

  • @ThiefMaster:全局构造函数的最简单实现(没有来自OS和底层C运行时条目代码的特殊支持)是C++编译器在`main`的开头生成函数调用(`__main`是它的通用名称) )调用所有全局构造函数.每次`main`被递归调用时重建全局对象将是一件相当糟糕的事情...... :-) (8认同)
  • 我很好奇,为什么不能用C++调用它? (3认同)

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()超过初始/原始调用的可能性.


Tom*_*007 5

是的,我们可以在main()函数中调用main().

函数本身调用函数的过程称为递归.

好吧,你可以在main()函数中调用main(),但是你应该有一个不调用main()函数来终止程序的条件.

否则,程序永远不会返回并无限运行.

  • 除非编译器进行尾调用优化,但无论如何你不能依赖它,所以要避免无休止的递归。 (2认同)