37

(我使用的是 Visual C++ 2008)我一直听说 main()需要返回一个整数,但这里我没有输入return 0;并且它编译时出现 0 个错误和 0 个警告!在调试窗口中,它说程序已经以代码 0 退出。如果这个函数被命名为 main() 以外的任何名称,编译器会抱怨说 'blah' 必须返回一个值。粘贴 areturn;也会导致错误出现。但是完全不考虑它,它编译得很好。

#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

4 回答 4

73

3.6.1 主要功能

……

2 实现不应预定义main功能。该功能不得重载。它的返回类型应该是 type int,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:

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

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

....它继续添加...

5 returnin 的语句main具有离开主函数(销毁任何具有自动存储持续时间的对象)并exit以返回值作为参数调用的效果。如果控制到达末尾main没有遇到return语句,效果就是执行return 0

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

于 2008-08-22T12:54:54.313 回答
18

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

于 2008-08-22T12:52:03.417 回答
3

如果您在主函数中不包含一个,我很确定 VC++ 只会插入一个 return 0。同样的事情也可能发生在函数上,但在这些情况下,至少你会得到一个警告。

于 2008-08-22T12:51:49.033 回答
2

第 6.6.3/2 节指出-“从函数的末尾流出等效于没有值的返回;这会导致返回值的函数出现未定义的行为。”。

一个例子是下面的代码,它充其量在 VS 2010/g++ 上给出警告

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

int main(){
   f();
}

因此,正如前面的回复所指出的那样,重点是“主要”是特殊的。

于 2010-08-16T11:20:18.960 回答