猿问

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

我读到C ++标准禁止在中进行递归main(),但是g ++编译以下代码时不会产生任何抱怨:


int main()

{

    main();

}

谁能澄清一下?

慕桂英4014372
浏览 520回答 3
3回答

拉丁的传说

根据3.6.1 / 3中的标准,它不是:该功能main 不得在程序中使用 (3.2)的定义使用感:如果对象或非重载函数的名称出现在可能评估的表达式中,则使用该函数。

qq_花开花谢_0

我会做鱼,并解释为什么这是僵尸。在C或C ++程序可以开始运行之前,必须先初始化CRT。打开stdin / out / err,调用初始化程序,诸如此类。有两种基本策略可以完成此任务,其中包括繁重的平台实现细节。程序的起始地址指向CRT初始化函数,该函数最终调用main()。具有功能丰富的加载程序的全功能操作系统上常见,该加载程序可以支持可执行映像中的任意部分。编译器将代码注入到main()函数中,该函数调用CRT初始化函数。启动函数始终是main()。在有限的加载器功能的嵌入式平台上常见。递归main()现在是一个问题,CRT启动代码将以不可预测的堆栈状态再次调用。

一只名叫tom的猫

索赔这里是它确实是明令禁止:好吧,标准指出:3.6.1.3 “功能主体不得在程序内使用。”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;}(请注意,我添加了一个get-out子句。我什至无法假设无限递归编码,它在我身上重复出现。)
随时随地看视频慕课网APP
我要回答