我收到了这段代码:
#include<stdio.h>
#include<stdlib.h>
void main(void)
{
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf("\n Malloc failed \n");
return;
}
else
{
// Do some processing
free(ptr);
}
return;
}
它在Visual C中成功编译,但不在gcc中编译,我得到“错误:'main'必须返回'int'”。那么main()函数的返回类型'int'是一个约定(用于编译器定义),还是C规则?
答案 0 :(得分:10)
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
: Program startup和The main
Function and Program Execution处的文档。但是,MSVC 2008及更高版本会被记录为允许void main()
:请参阅main
: Program Startup。 main()
的三参数形式被注意为附录J中的共同扩展:
J.5通用扩展
以下扩展在许多系统中被广泛使用,但并不是所有系统都可移植 实现。包含可能导致严格符合的任何扩展名 程序变为无效会导致实现不一致。这样的例子 扩展是新关键字,在标准头中声明的额外库函数,或 名称不以下划线开头的预定义宏。
J.5.1环境参数
在托管环境中,
main
函数接收第三个参数char *envp[]
, 指向以char
为指针的以null结尾的指针数组,每个指针都指向一个字符串 它提供有关此程序执行环境的信息 (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
中的EXIT_SUCCESS
和<stdlib.h>
,但是0已经确立,1也是如此。另请参阅Exit codes greater than 255 — possible?。
7.22.4.4
exit
函数¶5最后,控制权返回给主机环境。如果
status
的值为零或EXIT_SUCCESS
,则会返回状态成功终止的实现定义形式。如果status
的值为EXIT_FAILURE
,则会返回状态不成功终止的实现定义形式。否则返回的状态是实现定义的。
答案 1 :(得分:0)
void main()
是非标准C,int main()
是标准。
答案 2 :(得分:0)
根据c标准main()
应该返回整数以通知成功或失败。一般来说,成功它返回零,失败则返回一个整数值(正或负)。
通常main声明为
int main(void);
所以它期望整数作为返回类型。
如果有命令行参数,
int main(int argc,char *argv[]);