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