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)中的程序内
的定义使用感:
如果对象或非重载函数的名称出现在可能已评估的表达式中,则使用该函数.
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.6.1-3:
函数main不得在程序中使用(3.2).main的链接(3.5)是实现定义的.声明main为内联或静态的程序格式不正确.名称main不以其他方式保留.[示例:成员函数,类和枚举可以称为main,其他名称空间中的实体也可以称为main.]