main()函数的返回类型

时间:2013-07-18 05:13:41

标签: c main

我收到了这段代码:

#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规则?

3 个答案:

答案 0 :(得分:10)

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 startupThe main Function and Program Execution处的文档。但是,MSVC 2008及更高版本会被记录为允许void main():请参阅main: Program Startupmain()的三参数形式被注意为附录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[]);