这个问题是出于好奇;在为测试程序编写主程序时,我没有返回任何内容main
(没有return
语句 in main
)。但我宣布 main 为int main()
. 并且编译成功。
好像有任何其他函数用int
返回类型编写但实际上没有返回int
,我会得到一个错误
“函数名”必须返回值
那么为什么编译器对main
函数的抱怨不一样呢?
这个问题是出于好奇;在为测试程序编写主程序时,我没有返回任何内容main
(没有return
语句 in main
)。但我宣布 main 为int main()
. 并且编译成功。
好像有任何其他函数用int
返回类型编写但实际上没有返回int
,我会得到一个错误
“函数名”必须返回值
那么为什么编译器对main
函数的抱怨不一样呢?
通常情况下,不允许控制流在不返回某些内容的情况下到达非 void 函数的末尾。按照标准中的规定,该main
函数的处理方式不同。
来自http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2960.pdf:
§ 3.6.1/5
如果控制到达main的末尾没有遇到return语句,效果就是执行return 0;
至于理由,老实说,我不确定。如果有人知道,请将其添加到我的答案中或作为评论。
在 C++ 中,int main()
可以不带返回值,此时默认返回 0。
5.1.2.2.3 程序终止
1 如果主函数的返回类型是与int兼容的类型,则从初始调用主函数返回相当于以主函数返回的值作为参数调用exit函数;11)到达}终止主函数返回值 0。如果返回类型与 int 不兼容,则返回到宿主环境的终止状态未指定。
但是你应该更好地使用 EXIT_SUCCESS
或EXIT_FAILURE
从main()
.
即使您返回一个 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 或更大表示打开文件有困难。