主函数(main()函数)的返回类型是什么?

3

I get this code:

#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语言的规则呢?


main()函数应该始终返回int类型。 - Pixelchemist
同上,返回代码始终为INT,例如:-1、0等。您还应该初始化该值。 - FrankRuperto
3
大约10年前,我在一些严格的 ANSI-C 讨论组中发布了 "void main()"。我想我从来没有遭到过更多的愤怒攻击。其实我并不是在讨论这个问题;这只是一个嵌入式系统代码片段的一部分,我只是在询问一个问题。在那种微小的 CPU 中,main() 函数返回将会导致灾难性的失败(因为它是固件,应该永远运行),但那些人并不关心。我从未得到我的问题的答案,只花了剩下的时间解释如何 main() 函数不能够返回。现在,即使 main() 函数永远不返回,我也总是会返回 int。 - c.fogelklou
1
在独立实现中,main()函数的返回类型应该是实现告诉你要使用的类型。即使是在 comp.lang.c 上的 Ansi-C 硬核人士也应该知道这一点... - This isn't my real name
3个回答

12

C标准(ISO/IEC 9899:2011)表示:

5.1.2.2.1 程序启动

1 在程序启动时调用的函数名为 main。该实现不声明此函数的原型。它应定义为返回类型为 int 且不带参数:

int main(void) { /* ... */ }

或使用两个参数(此处称为argcargv,但可以使用任何名称,因为它们是在声明它们的函数内部局部的):

int main(int argc, char *argv[]) { /* ... */ }

因此,唯一可移植的main()声明是返回类型为int的声明。如果MSVC定义了允许void(“或以某种其他实现定义的方式”)的声明,那就这样做,但不要期望该代码是可移植的。旧版本的Microsoft编译器(包括MSVC 2005及之前的版本)不允许使用void main():请参见main: Program startupThe main Function and Program Execution上的文档。但是,MSVC 2008及更高版本的文档允许void main():请参见main: Program Startup。在附录J中,注明了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函数的初始调用返回等效于使用main函数返回的值作为其参数调用exit函数;达到终止main函数的}返回值为0。如果返回类型与int不兼容,则返回给主机环境的终止状态未指定。

11) 根据6.2.4的规定,在前一种情况下,具有在后一种情况下不应存在的自动存储期的对象的生存期将结束。

请注意,0被定义为“成功”。“stdlib.h”中的EXIT_FAILUREEXIT_SUCCESS也可以使用,但是0已经很成熟了,1也是如此。另请参见Exit codes greater than 255 — possible?

7.22.4.4 exit 函数

¶5 最后,控制


1
我认为对于OP来说,应该补充说明在main函数前的int是进程终止状态,当进程完成时会返回该状态。 - Grijesh Chauhan
我正要引用C标准中的同样内容。无论如何+1 :) - 0decimal0
C标准的引用很有帮助。 - lulyon
@lulyon 我还想补充一点:不要只返回 01,而是使用 EXIT_SUCCESS, EXIT_FAILURE - Grijesh Chauhan
@GrijeshChauhan 为什么要这样做?因为通常情况下我不使用EXIT_SUCCESS。在这种情况下使用宏似乎是不必要的。 - lulyon
1
@lulyon 我也使用 exit(EXIT_SUCCESS)阅读 - Grijesh Chauhan

0
根据C标准,main()函数应该返回一个整数来表示成功或失败。通常情况下,它返回零表示成功,返回一个整数值(可以是正数或负数)表示失败。一般情况下,main函数的声明如下:

 int main(void); 

它期望返回整数类型。

如果有命令行参数,

int main(int argc,char *argv[]);

在运行程序时,我们如何知道它是否返回0或1? - Koolman

0

void main() 是非标准的 C 语言写法,而 int main() 则是标准写法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接