为啥 int main() 编译?

Posted

技术标签:

【中文标题】为啥 int main() 编译?【英文标题】:Why does int main() compile?为什么 int main() 编译? 【发布时间】:2010-09-06 12:57:07 【问题描述】:

(我使用的是 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++ 中的错误吗?

【问题讨论】:

【参考方案1】:

3.6.1 主要功能

....

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

int main()  /* ... */ 

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

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

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

试图找到 C++ 标准的在线副本,以便引用这段话I found a blog post that quotes all the right bits better than I could.

【讨论】:

g++ 默认情况下会向您抛出错误。大多数其他编译器会“返回 0” 如果您在 main() 中没有 return 语句,旧版本的 GCC 实际上会在某些情况下返回垃圾。 @wakingrufus,你使用的是什么版本的 g++?我得到了 sparkes 描述的正确行为。 请注意,引用的标准是 C99,而不是 C89 或 C++98,但 MSVC 在用作 C 编译器时主要实现 C89 而不是 C99 或 C11。但是,您也可以查阅 Microsoft 文档 — 其中 void main(…) 被定义为 OK(在 C 中)。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

从非 void 函数的末尾脱落是未定义的行为。只有 main 是特殊的,隐式返回。【参考方案4】:

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

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

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


int main()
   f();

因此,正如前面的回复所指出的那样,'main' 是特殊的。

【讨论】:

以上是关于为啥 int main() 编译?的主要内容,如果未能解决你的问题,请参考以下文章

将一个int(例如10)分配给c ++中结构中的字符串成员,为啥它编译成功?

为啥将 main 声明为数组编译?

为啥手机编译器class后面默认是Main呢

为啥总是编译错误??compile error

代码崩溃编译器:main() 返回结构而不是 int

为啥编译器将“char”匹配到“int”而不是“short”?