为什么int main() {}可以编译?

37

(我正在使用Visual C++ 2008) 我一直听说main()必须返回一个整数,但是在这里我没有加入return 0;,它却以0个错误和0个警告编译通过了!在调试窗口中它显示程序以代码0退出。如果这个函数命名为main()之外的任何名称,编译器都会抱怨说'blah'必须返回一个值。加上一个return;也会导致出现错误。但是完全省略它,它就可以正常编译。

#include <iostream>
using namespace std;

int main()
{
    cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}

这可能是VC++中的一个错误吗?

4个回答

72

3.6.1 主函数

....

2 实现不应该预定义 main 函数。此函数不得重载。它应该具有类型为 int 的返回类型,但除此以外,其类型是实现定义的。所有实现都应允许以下两种 main 定义:

int main() { /* ... */ }

int main(int argc, char* argv[]) {
/* ... */
}

......并且它继续添加......

main 函数中的 return 语句会使得函数离开(销毁任何具有自动存储期的对象) 并将返回值作为参数调用 exit. 如果控制流在 main 结尾处到达而没有遇到 return 语句, 那么效果等同于执行 return 0;

我试图找到 C++ 标准的在线副本,以便引用这段话。 我找到了一篇博客文章,其中引用了比我更好的所有正确部分。


默认情况下,g++会抛出一个错误。而大多数其他编译器则会使用“return 0”。 - wakingrufus
4
如果在main()函数中没有返回语句,旧版本的GCC实际上会在某些情况下返回垃圾值。 - Mark Bessey
9
你使用的是哪个版本的g++?我得到了sparkes所描述的正确行为。 - Kevin
请注意,标准引用的是C99,而不是C89或C++98,但当MSVC用作C编译器时,它大多实现了C89而不是C99或C11。然而,您也可以查阅Microsoft文档 - 在其中void main(…)被定义为OK(在C中)。 - Jonathan Leffler

18

这是C++语言标准的一部分。如果在main函数中没有显式return语句,会为您生成一个隐式的return 0。


3
我很确定如果你在主函数中没有包含返回0语句,VC++会自动插入一个。同样的情况也可能发生在其他函数中,但至少会有警告提示。

5
对于非 void 函数而言,跳出函数结尾是未定义的行为。只有 main 函数具有隐式返回值的特殊性。 - Fred Nurk

2

第6.6.3/2节规定:“函数结束时没有返回值等同于返回一个没有值的return语句;这会导致有返回值的函数出现未定义行为。”

以下代码是一个例子,在VS 2010/g++上最好只能给出警告:

int f(){
   if(0){
      if(1)
         return true;
   }
}

int main(){
   f();
}

所以问题的关键在于,正如之前的回答所指出的那样,“main”是特殊的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接