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

Pau*_*han 4 c++ program-entry-point

可能重复:
在C++中递归到main()是否合法?

#include <iostream>
using namespace std;

int main() {
  static int var = 5;
  std::cout << --var;
  if(var)
    main();
}
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*rav 17

代码格式不正确,因为它违反了shall构造§3.6.1.3

§3.6.1.3说:

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


应该构建

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

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

§3.6.1.3定义可诊断的规则.

根据§1.4.2:

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

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

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


结论

编译器可以随心所欲地做任何事情.在Comeau Online(一个更符合标准的编译器)上尝试相同的代码.我收到这个错误 "function "main" may not be called or have its address taken"

  • @Martin:这不是我读它的方式;-).第三个条款仅适用于"不需要诊断的规则",并且根据1.4.1的引用,必须明确标注此类规则.在3.6.1.3附近没有出现这种符号. (3认同)