C++为什么main工作没有返回值

Zoo*_*mIn 7 c++

这个问题出于好奇; 在为测试程序编写main时,我没有返回任何内容main(没有return声明main).但我宣称主要是int main().它编译成功.

如果有任何其他函数用int返回类型编写并且实际上没有返回int,我会得到一个错误

'函数名'必须返回值

那么为什么编译器不会为main功能抱怨相同?

Tam*_*lei 10

通常,不允许控制流到达非空函数的末尾而不返回某些内容.main按标准规定,该功能的处理方式不同.

来自http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2960.pdf:

§3.6.1/ 5

如果控制到达main的末尾而没有遇到return语句,则效果是执行return 0;

至于理由,老实说,我不确定.如果有人知道,请将其添加到我的答案或作为评论.

  • 我查了一下。我相信这是随 C99 引入的,显然 C99 的基本原理是有缺陷的。它有 5.1.2.2.1 程序启动的注释,然后标记下一章 5.1.2.3 程序执行。应该是5.1.2.2。因此,实际第 5.1.2.3 章中应包含的程序终止理由在行动中消失了。因此,main 在 C99 中不允许返回代码_并且没有合理的理由_。 (2认同)
  • 我实际上查阅了 C90 标准,并且条款 ** 是 ** 那里。实际上,第 2.1.2 节“执行环境”与 C99 的第 5.1.2 节“执行环境”几乎相同。而且我很确定 C++98 也确实有该条款。所以这个规则肯定不是在 C99 中引入的。 (2认同)
  • @ach:我知道已经有一段时间了,但是......你确定你有正确的文件吗?我这里的 ANSI/ISO 9899:1990 有一个 *2 标准参考* 部分,这不是我们要找的,还有 *5.1.2.2.3 程序终止* 部分,就像 C99 一样。它在那里指出(强调我的)“如果主函数执行没有指定任何值的返回,则返回到主机环境的终止状态是**未定义**”。我猜他们更喜欢定义明确的 EXIT_SUCCESS 而不是未定义的返回状态,这对我来说已经足够好了。但 C89/90 中不存在“隐式 `return 0;`”。 (2认同)

Roh*_*ews 5

在 C++ 中,int main()可以不带返回值,此时它默认返回 0。

5.1.2.2.3 程序终止

1 如果 main 函数的返回类型是与 int 兼容的类型,则从初始调用 main 函数返回相当于以 main 函数返回的值作为参数调用 exit 函数;11) 到达 }终止 main 函数返回值 0。如果返回类型与 int 不兼容,则返回给宿主环境的终止状态是未指定的。

但是你应该更好地使用 EXIT_SUCCESSEXIT_FAILUREmain().

即使您返回的是 int,某些操作系统 (Windows) 也会将返回值截断为单个字节 (0-255)。Unix 和大多数其他操作系统可能一样。返回 EXIT_SUCCESS 或 EXIT_FAILURE 以外的任何东西都是自找麻烦

来自GNU 库的引用

一些非 POSIX 系统对退出状态值使用不同的约定。为了获得更大的可移植性,您可以分别使用宏 EXIT_SUCCESS 和 EXIT_FAILURE 作为成功和失败的常规状态值。它们在文件 stdlib.h 中声明。

— 宏:int EXIT_SUCCESS 此宏可与退出函数一起使用以指示程序成功完成。

在 POSIX 系统上,该宏的值为 0。在其他系统上,该值可能是其他(可能是非常量)整数表达式。

— 宏:int EXIT_FAILURE 此宏可与 exit 函数一起使用,以在一般意义上指示不成功的程序完成。

在 POSIX 系统上,该宏的值为 1。在其他系统上,该值可能是其他(可能是非常量)整数表达式。其他非零状态值也表示失败。某些程序使用不同的非零状态值来指示特定类型的“不成功”。例如,diff 使用状态值 1 表示文件不同,使用状态值 2 或更多表示打开文件有困难。

  • 对标准进行了一些挖掘:`return 0`,隐式和显式等效于调用`exit(0)`(§3.6.1,5),这又等效于调用`exit(EXIT_SUCCESS)`(§ 18.5 C++;§7.22 C)。在这两种情况下,确保可移植性都是编译器的责任(同上),因此无论您使用“EXIT_SUCCESS”还是“return 0”或完全省略 return 都没有任何区别。但是,对于非零返回码没有给出这样的保证,因此使用`EXIT_FAILURE` 至少在理论上可以提高可移植性。 (5认同)
  • 在考虑返回 `int` 文字与返回 `EXIT_*` 之一时,你的引用(顺便说一句,如果你能提供一个来源会很好)是有道理的。它确实_没有_解决使用默认返回与显式返回`EXIT_SUCCESS`的情况。所以我仍然不相信:) (2认同)