C 标准 (ISO/IEC 9899:2011) 说:
5.1.2.2.1 程序启动
1 程序启动时调用的函数名为main
。实现没有声明这个函数的原型。它应定义为返回类型int
且不带参数:
int main(void) { /* ... */ }
或带有两个参数(这里称为argc
and argv
,尽管可以使用任何名称,因为它们对于声明它们的函数是本地的):
int main(int argc, char *argv[]) { /* ... */ }
或同等学历; 10)或以其他一些实现定义的方式。
10) 因此,int
可以替换为定义为 的 typedef 名称int
,或者 argv 的类型可以写为
char **argv
,依此类推。
因此,唯一可移植声明main()
的返回类型为int
. 如果 MSVC 定义void
是允许的(“或以其他实现定义的方式”),那就这样吧,但不要期望代码是可移植的。旧版本的 Microsoft 编译器(直到并包括 MSVC 2005)不允许:请参阅以下void main()
文档main
:程序启动和函数和程序执行。但是,MSVC 2008 及更高版本被记录为允许:请参阅:程序启动。的三自变量形式在附录 J 中作为常见扩展进行了说明:main
void main()
main
main()
J.5 通用扩展
以下扩展在许多系统中广泛使用,但不能移植到所有实现中。包含可能导致严格符合的程序无效的任何扩展都会导致实现不符合。此类扩展的示例是新关键字、标准头文件中声明的额外库函数或名称不以下划线开头的预定义宏。
J.5.1 环境参数
在托管环境中,该main
函数接收第三个参数 ,char *envp[]
它指向一个以空结尾的指针数组char
,每个指针指向一个字符串,该字符串提供有关此程序执行环境的信息(5.1.2.2.1 )。
从返回的值main()
以实现定义的方式传输到“环境”。
5.1.2.2.3 程序终止
1 如果main
函数的返回类型是与 兼容的类型int
,则从函数的初始调用返回main
相当于以exit
函数返回的值main
作为参数调用函数;11)到达}
终止
main
函数返回值0。如果返回类型与 不兼容int
,则返回到宿主环境的终止状态未指定。
11)根据 6.2.4,在前一种情况下声明了自动存储持续时间的对象的生命周期main
将结束,即使在后者中它们不会有。
请注意,这0
是强制性的“成功”。如果您愿意,可以使用EXIT_FAILURE
and EXIT_SUCCESS
from <stdlib.h>
,但 0 已确定,1 也是如此。另请参阅大于 255 的退出代码 — 可能吗?.
7.22.4.4exit
功能
¶5 最后,控制权返回到主机环境。如果 的值为status
0 或,则返回成功终止EXIT_SUCCESS
状态的实现定义形式。如果值为 ,则返回状态未成功终止的实现定义形式。否则返回的状态是实现定义的。status
EXIT_FAILURE