main() 函数的返回类型
Posted
技术标签:
【中文标题】main() 函数的返回类型【英文标题】:The return type of main() function [duplicate] 【发布时间】:2013-07-16 21:42:29 【问题描述】:我得到这个代码:
#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' must return 'int'”。那么 'int' 是约定(由编译器定义)还是 C 的规则?
【问题讨论】:
main() 应该总是返回 int, 同上,返回码始终为 INT,例如:-1、0 等。您还应该初始化该值。 大约 10 年前,我在一个核心 ansi-C 新闻组上发布了 void main()。我不认为我曾经有过更多的硫酸。我什至没有发布关于那个。它只是我问一个问题的嵌入式系统的 sn-p 的一部分。在那个微型 CPU 上,返回 main() 将是一个灾难性的故障(它是固件;它应该永远运行)但那些人并不关心。从来没有回答我的问题,只是在剩下的时间里解释 main 如何无法返回。现在我总是返回 int,即使 main() 永远不会返回。 在独立实现中,main()
的返回类型应该是实现告诉您使用的任何类型。即使是 comp.lang.c 的核心 Ansi-C 人员也应该知道...
【参考方案1】:
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
的指针数组,每个指针都指向一个字符串 为程序的执行提供有关环境的信息 (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
被强制要求为“成功”。如果您愿意,可以使用 <stdlib.h>
中的 EXIT_FAILURE
和 EXIT_SUCCESS
,但 0 已确定,1 也是如此。另请参阅 Exit codes greater than 255 — possible?。
7.22.4.4
exit
函数¶5 最后,控制权返回到主机环境。如果
status
的值为零或EXIT_SUCCESS
,则返回状态成功终止 的实现定义形式。如果status
的值为EXIT_FAILURE
,则返回状态不成功终止 的实现定义形式。否则返回的状态是实现定义的。
【讨论】:
我认为对于 OP,应该在 main 之前添加int
是进程终止状态,当进程完成时
我正要从 C 标准中引用相同的内容。无论如何+1 :)
引用 C 标准很有帮助。
@lulyon 我还想补充一件事:不要返回0
或1
,而是使用EXIT_SUCCESS
, EXIT_FAILURE
@lulyon 我也用exit(EXIT_SUCCESS)
, Read【参考方案2】:
void main()
是非标准 C,int main()
是标准。
【讨论】:
【参考方案3】:根据 c 标准main()
应该返回整数以通知成功或失败。通常成功返回零,失败返回整数值(正或负)。
通常 main 声明为
int main(void);
所以它期望整数作为返回类型。
如果有命令行参数,
int main(int argc,char *argv[]);
【讨论】:
那么在运行程序时我们怎么知道它返回的是 0 还是 1 呢?以上是关于main() 函数的返回类型的主要内容,如果未能解决你的问题,请参考以下文章