为啥 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() 编译?的主要内容,如果未能解决你的问题,请参考以下文章