在C++中递归到main()是否合法?

ano*_*ard 45 c++ recursion standards program-entry-point

我读到C++标准禁止递归main(),但是g ++编译以下代码而没有抱怨:

int main()
{
    main();
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以澄清这个吗?

ice*_*ime 50

根据3.6.1/3中的标准,它不是:

该功能main 不应使用 (3.2)中的程序内

的定义使用感:

如果对象或非重载函数的名称出现在可能已评估的表达式中,则使用函数.

  • 不,它确实需要诊断.见1.4/1和1.4/2.海湾合作委员会是血腥的错误,有时它[比允许的更迂腐](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41431). (6认同)
  • 当然,这通常不会被强制执行,因为只有当你进行的编程不是很好时才有用. (2认同)

Han*_*ant 37

我会做鱼并解释为什么这是禁止的.在C或C++程序开始运行之前,必须首先初始化CRT.打开stdin/out/err,调用初始值设定项,这类事情.完成此任务有两个基本策略,即重型平台实现细节.

  • 程序的起始地址指向CRT init函数,该函数最终调用main().常用于具有花式加载器的全功能操作系统,该加载器可以支持可执行映像中的任意部分.

  • 编译器将代码注入调用CRT初始化函数的main()函数中.start函数始终为main().常见于具有有限加载器功能的嵌入式平台 递归main()现在是一个问题,将以不可预测的堆栈状态再次调用CRT启动代码.


T.J*_*der 22

这里的主张是它确实是特别禁止的:

那么,标准规定:

3.6.1.3
"函数main不得在程序中使用."

5.2.2.9
"允许递归调用,但名为main的函数除外"

当然,你可以这样做:

int main(int argc, char* argv[]) {
    return foo(argc, argv);
}
int foo(int argc, char* argv[]) {
    if (some_condition) {
        return foo(argc, argv);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(注意我添加了一个get-out子句.我甚至无法假设代码无限递归,它会重复我.)

  • 好吧,如果你的函数是尾递归的,并且编译器进行尾调用优化(大多数都做),那么可以导致无限递归而不会溢出堆栈;-) (3认同)

BЈо*_*вић 9

这不合法.阅读3.6.1-3:

函数main不得在程序中使用(3.2).main的链接(3.5)是实现定义的.声明main为内联或静态的程序格式不正确.名称main不以其他方式保留.[示例:成员函数,类和枚举可以称为main,其他名称空间中的实体也可以称为main.]