14

这个问题是出于好奇;在为测试程序编写主程序时,我没有返回任何内容main(没有return语句 in main)。但我宣布 main 为int main(). 并且编译成功。

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

“函数名”必须返回值

那么为什么编译器对main函数的抱怨不一样呢?

4

2 回答 2

18

通常情况下,不允许控制流在不返回某些内容的情况下到达非 void 函数的末尾。按照标准中的规定,该main函数的处理方式不同。

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

§ 3.6.1/5

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

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

于 2013-10-10T10:46:38.750 回答
5

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

5.1.2.2.3 程序终止

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

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

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

来自GNU 库的引述

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

— Macro: int EXIT_SUCCESS 这个宏可以和exit函数一起使用来表示程序成功完成。

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

— Macro: int EXIT_FAILURE 这个宏可以和exit函数一起使用,表示一般意义上的程序完成不成功。

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

于 2013-10-10T10:55:14.593 回答