为什么我的C ++编译器允许递归调用main?

时间:2011-03-03 05:53:56

标签: c++ main

  

可能重复:
  Is it legal to recurse into main() in C++?

#include <iostream>
using namespace std;

int main() {
  static int var = 5;
  std::cout << --var;
  if(var)
    main();
}

gcc编译代码http://ideone.com/lIp3A。我知道在C ++中main不能在main中使用。为什么这段代码会编译?

1 个答案:

答案 0 :(得分:17)

代码格式错误,因为它违反了shall的{​​{1}}构造

§3.6.1.3说:

  

函数main不得在程序中使用。


应构建

可诊断规则 定义为(§1.4.1):

  

可诊断规则集包含本国际标准中的所有语法和语义规则,但那些包含“无需诊断”的明确表示法或描述为“未定义行为”的规则除外。

§3.6.1.3定义可诊断规则

根据§1.4.2:

  

- 如果某个程序不违反本国际标准中的规则,则符合条件的实施应在其资源限制内接受并正确执行该程序。

     

- 如果某个程序包含违反任何可诊断规则的行为,则符合要求的实施应至少发出一条诊断消息,但

除外      

- 如果某个程序违反了不需要诊断的规则,则本国际标准不对该程序的实施提出任何要求。


结论

编译器可以随心所欲地做任何事情。在Comeau Online上尝试相同的代码(更符合标准的编译器)。 我收到这个错误 §3.6.1.3