lul*_*yon 1 c program-entry-point
我得到这个代码:
#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的规则?
Jon*_*ler 10
C标准(ISO/IEC 9899:2011)说:
5.1.2.2.1程序启动
1命名程序启动时调用的函数
main.该实现声明此函数没有原型.它应定义为返回类型int且没有参数:Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为
argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }或同等学历; 10)或以某种其他实现定义的方式.
10) 因此,
int可以用定义为的typedef名称替换int,或者可以将argv的类型写为char **argv,依此类推.
因此,唯一的便携式声明main()具有返回类型int.如果MSVC定义void允许('或以某种其他实现定义的方式'),那么就是这样,但不要指望代码是可移植的.微软编译器的旧版本(直至并包括2005年MSVC)不允许void main():请阅读文档main:程序启动和的main功能和程序执行.但是,MSVC 2008及更高版本的文档允许void main():请参阅main:程序启动.三参数形式main()被注意为附录J中的共同扩展:
J.5常用扩展
以下扩展在许多系统中广泛使用,但不能移植到所有实现.包含任何可能导致严格符合程序无效的扩展会导致实现不一致.此类扩展的示例包括新关键字,标准标头中声明的额外库函数或名称不以下划线开头的预定义宏.
J.5.1环境参数
在托管环境中,该
main函数接收第三个参数,char *envp[]该参数指向以null结尾的指针数组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_FAILURE和EXIT_SUCCESS来<stdlib.h>,但是0已经很好建立了,所以也是1.参见大于255的退出代码 - 可能吗?.
7.22.4.4
exit功能5最后,控制权返回给主机环境.如果值
status为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式.如果值status是EXIT_FAILURE,地位的实现定义的形式成功终止返回.否则返回的状态是实现定义的.