为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕桂英4014372 2019-10-11 10:47:17
我读到C ++标准禁止在中进行递归main(),但是g ++编译以下代码时不会产生任何抱怨:int main(){    main();}谁能澄清一下?
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

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


该功能main 不得在程序中使用 (3.2)


的定义使用感:


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


查看完整回答
反对 回复 2019-10-11
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

我会做鱼,并解释为什么这是僵尸。在C或C ++程序可以开始运行之前,必须先初始化CRT。打开stdin / out / err,调用初始化程序,诸如此类。有两种基本策略可以完成此任务,其中包括繁重的平台实现细节。

  • 程序的起始地址指向CRT初始化函数,该函数最终调用main()。具有功能丰富的加载程序的全功能操作系统上常见,该加载程序可以支持可执行映像中的任意部分。

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


查看完整回答
反对 回复 2019-10-11
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

索赔这里是它确实是明令禁止:


好吧,标准指出:


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子句。我什至无法假设无限递归编码,它在我身上重复出现。)


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 487 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信