2

我得到这个代码:

#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'”。那么 main() 函数的返回类型“int”是约定(供编译器定义)还是 C 规则?

4

3 回答 3

11

C 标准 (ISO/IEC 9899:2011) 说:

5.1.2.2.1 程序启动

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

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

或带有两个参数(这里称为argcand argv,尽管可以使用任何名称,因为它们对于声明它们的函数是本地的):

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

或同等学历; 10)或以其他一些实现定义的方式。

10) 因此,int可以替换为定义为 的 typedef 名称int,或者 argv 的类型可以写为 char **argv,依此类推。

因此,唯一可移植声明main()的返回类型为int. 如果 MSVC 定义void是允许的(“或以其他实现定义的方式”),那就这样吧,但不要期望代码是可移植的。旧版本的 Microsoft 编译器(直到并包括 MSVC 2005)不允许:请参阅以下void main()文档main:程序启动函数和程序执行。但是,MSVC 2008 及更高版本被记录为允许:请参阅:程序启动。的三自变量形式在附录 J 中作为常见扩展进行了说明:mainvoid main()mainmain()

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是强制性的“成功”。如果您愿意,可以使用EXIT_FAILUREand EXIT_SUCCESSfrom <stdlib.h>,但 0 已确定,1 也是如此。另请参阅大于 255 的退出代码 — 可能吗?.

7.22.4.4exit功能

¶5 最后,控制权返回到主机环境。如果 的值为status0 或,则返回成功终止EXIT_SUCCESS状态的实现定义形式。如果值为 ,则返回状态未成功终止的实现定义形式。否则返回的状态是实现定义的。statusEXIT_FAILURE

于 2013-07-18T05:17:40.437 回答
0

void main()是非标准C,int main()是标准。

于 2013-07-18T05:16:41.920 回答
0

根据 c 标准main()应该返回整数以通知成功或失败。通常成功返回零,失败返回整数值(正或负)。通常 main 被声明为

 int main(void); 

所以它期望整数作为返回类型。

如果有命令行参数,

int main(int argc,char *argv[]);
于 2013-07-18T05:17:04.373 回答