所有编译器都要求int main()函数返回一个值吗?

21

为什么在某些C++编译器中使用int main()时不需要包含return语句?Turbo C++有什么不同吗?


据我所知,Turbo 强制使用无效的 C++ void main 并为您返回 0。 - chris
26
我相当确信 Turbo C++ 没有符合现有的任何 C++ 标准。据我所知,Turbo C++ 的开发已经停止,时间是在 1998 年第一个 C++ 标准被制定的时候。 - Mats Petersson
12
我希望你只是出于历史好奇心提出这个问题,而不是因为你打算使用二十年前的编译器做任何事情。 - Mike Seymour
7个回答

45
在C++、C99和C11中,语言的一个特殊规则是,如果控制流程达到main函数的末尾,则该函数会隐式返回0

17
不,这不是。 - No Idea For Name
7
“依赖main()中代码的人也会在其他函数中这样做。” 绝对不是这样!我可以从另一方面进行辩论:那些毫无必要地返回0的人很可能缺乏线索,所以他们可能会掉出函数的末尾。他们可能还会编写500行长的函数 :) - juanchopanza
7
这是一个观点问题,但我同意 @H2CO3 的想法。在我看来,这个例外规则完全没有道理,就像任何无用的规则一样,我认为它只会带来麻烦。 - syam
14
面对现实吧。从main()返回的大多数情况下,都有一个意义,这是应用程序旨在从批处理/脚本/其他依赖于返回代码的程序运行的结果。编写此类应用程序/工具的人都知道这一点,我认为这并不成问题,但是谁会关心我从Microsoft Word或Visual Studio中获取的返回代码呢?好吧,我知道并且同意这是一个好的代码规范,但我不认为这是你可以做的最糟糕的事情。 - evilruff
15
你说的很有道理,但我宁愿允许使用void main()(并且让运行时“转换”为返回0的int main()),而不是为了遵守返回规则而出现奇怪的例外。但也许这只是我的想法。 - syam
显示剩余15条评论

26
在C++和C99/C11中,如果在主函数中没有return语句,则默认返回0。
§ 3.6.1主函数
在主函数中的return语句会使main函数结束(销毁所有具有自动存储期限的对象),并调用std::exit函数,并将返回值作为参数传递。如果控制流程到达main函数结尾而没有遇到return语句,则执行return 0;语句的效果相同。
同时请阅读维基百科页面C/C++ main function 编译器会在main()函数末尾插入一个隐含的return 0;语句,以便在程序员未定义返回值的情况下使用。这个行为是C++标准所要求的。

1
一个小错误:对于C语言来说,在C89中并非如此,只有C99和C11支持它。 - Yu Hao

13

main函数必须返回一个int类型的值。尽管一些编译器,例如Turbo C++,可能允许其他的返回值,比如void main,但这是错误的,绝不要使用这种方式。

然而,在C++中,如果你没有明确在main函数中返回值,则默认返回0

C++11 §3.6.1 Main function第5节

main函数中的返回语句会使该函数退出(销毁所有自动存储期对象)并调用std::exit函数,并将返回值作为参数传递给该函数。如果程序执行到main函数结尾时没有遇到任何返回语句,则默认执行return 0;

return 0;
请注意,对于C语言而言,这仅受C99及更高版本的支持,但不被C89支持。

4
标准规定,如果没有return语句,main函数将返回0。来自C++标准草案3.6.1节第5段的说明:

return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing

   return 0;

C99 草案标准的第 5.1.2.2.3 节中写道:

如果 main 函数的返回类型与 int 类型兼容,则从 main 函数的初始调用返回等同于使用 main 函数返回的值作为其参数调用 exit 函数;10)到达终止 main 函数的 } 返回值为 0。

据我所知,Turbo C++ 的最后一个版本相当老,我找不到任何定义它支持哪个标准(如果有的话)的内容。


1
无论您是否显式指定,TC都将返回EXIT_SUCCESS。

0

除了符合任意语言标准之外,当主函数结束时返回值没有强制性的理由。

这只是因为流行操作系统上的进程有一个已终止进程的返回代码概念。很容易想象一个不需要返回任何值的操作系统。您还可以想象一个世界,在该世界中,除非另有规定,否则所有进程都隐式地返回0 -- 在这种情况下,您可以将返回代码决策委托给系统调用。(实际上,这样的系统调用已经以C的exit函数的形式存在)。


0

正如其他人所说,有些编译器不需要你明确地写出 return 0;,但如果可能的话,这总是一个好主意。我不建议使用任何禁止你从主函数返回的编译器。

我想指出的是,int main 的返回值非常重要,实际上有用处。

main 函数的返回值有时被称为程序的 退出状态错误代码,其中零表示程序成功完成。其他程序和脚本可以访问此代码以确定您的程序是否成功完成。

更多信息请参见:http://en.wikipedia.org/wiki/Exit_status


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