在C ++中recursion到main()是合法的吗?
我读过C ++标准禁止在main()
recursion,但g ++编译下面的代码没有抱怨:
int main() { main(); }
任何人都可以澄清这一点?
根据3.6.1 / 3的标准,不是:
function
main
不能 在程序中 使用 (3.2)
使用的定义是:
如果对象或非重载函数的名称出现在潜在评估的expression式中,则使用该函数。
我会做鱼,解释为什么这是严厉的 。 在C或C ++程序开始运行之前,CRT必须先被初始化。 打开stdin / out / err,调用初始化器,就是这样的事情。 有两个基本的策略来完成这个工作,一个沉重的平台实施细节。
-
程序的起始地址指向CRT init函数,最终调用main()。 常见的function齐全的操作系统上有一个花式加载程序,可以支持可执行映像中的任意部分。
-
编译器将代码注入调用CRT初始化函数的main()函数中。 启动函数总是main()。 embedded式平台上通用的加载器function有限。 recursionmain()现在是一个问题,CRT启动代码将再次被调用,具有不可预知的堆栈状态。
这里的主张是确实禁止的:
那么标准说明:
3.6.1.3
“function主体不得在程序中使用”。5.2.2.9
“recursion调用是允许的,除了名为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; }
(注意:我添加了一个退出条款,我甚至不能假设代码是无限recursion的,所以我重复了这个)。
这是不合法的。 阅读3.6.1-3:
程序中不能使用function主(3.2)。 main的连接(3.5)是实现定义的。 声明main为内联或静态的程序是不合格的。 名称main不保留。 [例如:成员函数,类和枚举可以被称为main,就像其他名字空间中的实体一样。 ]
其他人已经解决了标准部分。 但是,我想要注意的是,如果你至less使用了一个这样的错误(取决于main
签名),那么g ++(至less4.6.2)会拒绝这个:
error: ISO C++ forbids calling '::main' from within program [-pedantic] error: ISO C++ forbids taking address of function '::main' [-pedantic]