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)  /* ... */ 

或带有两个参数(此处称为argcargv,尽管可以是任何名称 使用,因为它们在声明它们的函数中是本地的):

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 被强制要求为“成功”。如果您愿意,可以使用 &lt;stdlib.h&gt; 中的 EXIT_FAILUREEXIT_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 我还想补充一件事:不要返回01,而是使用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() 函数的返回类型的主要内容,如果未能解决你的问题,请参考以下文章

main() 函数的返回类型

C语言中的main()函数返回值是啥?

void main(), int main() 和int main(void)的区别

为啥 main() 函数不返回浮点值?

C语言中函数可以返回哪些类型的数据?(求详解)

C语言中 main 是啥意思?