这个问题出于好奇;在为测试程序编写main时,我没有从main
返回任何内容(return
中没有main
语句)。但是我将main声明为int main()
。它编译成功。
如果有任何其他函数使用int
返回类型编写并且实际上没有返回int
,我会收到错误
'函数名'必须返回值
那么为什么编译器不会对main
函数抱怨相同?
答案 0 :(得分:8)
通常,如果不返回某些内容,控制流不允许到达非void函数的末尾。 main
函数的处理方式不同,如标准中所述。
来自http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2960.pdf:
§3.6.1/ 5
如果控制到达main的末尾而没有遇到返回 声明,效果是执行返回0;
至于理由,老实说,我不确定。如果有人知道,请将其添加到我的答案或作为评论。
答案 1 :(得分:1)
在C ++中,int main()
可以没有返回值,此时它默认返回0.
5.1.2.2.3程序终止
1如果main函数的返回类型是兼容的类型 int,从初始调用到main函数的返回是等价的 使用main返回的值调用exit函数 作为其参数的函数; 11)到达终止主要的} 函数返回值0.如果返回类型不兼容 使用int,返回到主机环境的终止状态是 未指定的。
但您应该更好地使用EXIT_SUCCESS
或EXIT_FAILURE
从main()
返回。
即使你正在返回一个int,一些操作系统(Windows)也会截断 返回值为单个字节(0-255)。 Unix也是这样做的 大多数其他操作系统可能。回收除了以外的任何东西 EXIT_SUCCESS或EXIT_FAILURE要求麻烦
来自GNU Library的报价
某些非POSIX系统对退出状态使用不同的约定 值。为了更好的可移植性,您可以使用宏EXIT_SUCCESS 和EXIT_FAILURE表示成功的常规状态值 失败,分别。它们在文件stdlib.h中声明。
- Macro:int EXIT_SUCCESS此宏可以与exit一起使用 表示程序完成成功的功能。
在POSIX系统上,此宏的值为0.在其他系统上, value可能是其他(可能是非常量)整数表达式。
- Macro:int EXIT_FAILURE此宏可以与exit一起使用 在一般情况下表示程序完成失败的功能 感。
在POSIX系统上,此宏的值为1.在其他系统上, value可能是其他(可能是非常量)整数表达式。 其他非零状态值也表示失败。某些程序 使用不同的非零状态值来指示特定种类 “不成功”。例如,diff使用状态值1来表示 文件是不同的,2或更多意味着有困难 打开文件。