zoukankan      html  css  js  c++  java
  • C语言的main函数到底该怎么写

    公众号【编程珠玑】:专注但不限于分享计算机编程基础,Linux,C语言,C++,Python,数据库等编程相关[原创]技术文章,号内包含大量经典电子书和视频学习资源。欢迎一起交流学习,一起修炼计算机“内功”,知其然,更知其所以然。

    前言

    main函数是程序启动后执行的第一个自定义函数。从开始学习C语言到现在,我们似乎看到了很多个版本的main函数,那么哪一种才是正确的呢?我们先来看看目前有哪些版本。

    main函数版本

    第一种,没有返回值,没有入参:

    main()

    在C89标准中,这种写法是可以接受的,但使用现在的编译器编译时,会报告警,并且会将其返回值默认为int。实际上,如果函数没有显式声明返回类型,那么编译器会将返回值默认为int。

    第二种,返回值为void,没有入参:

    void main()

    这种形式的来源不得而知。但是为何这么多初学者使用?main函数的返回值最终会作为程序的退出状态,而一旦声明为void,在程序退出后,想要获取其退出状态也就不可以了。因此不建议其返回值为void。

    第三种,返回值为int,参数为void:

    int main(void)

    这是常见的一种写法。形参为void,表明它在调用的时候不能传入任何参数,那么它也就不能获取命令行参数了。

    第四种,返回值为int,没有参数:

    int main()

    看起来似乎和第三种没有什么区别,但这种形式却有些许不同。虽然它的声明没有入参,实际调用却可以传入参数,看下面的例子:

    #include<stdio.h>
    void  test();
    int main() 

        test(4);
        return 0; 
    }
    void test(int a)
    {
        printf("%d",a);
    }

    对于上面的程序,我们仍然可以编译并正常运行,test函数虽然声明为无入参,但调用时却是可以传入任何参数或不传参数的。

    第五种,返回值为int,有两个入参:

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

    这也是最常见的一种写法。第一个入参为命令行参数个数,第二个入参为命令行参数数组。通常用于实现需要从命令行获取参数的功能。

    第六种,返回值为int,有三个入参:

    int main(int argc,char *argv[],char *envp[]

    这种和第五种相似,但多了一个参数,用于获取环境变量,这种形式多源于编译器的扩展。但全局变量environ可以代替envp的作用,获取或者设置环境变量可以使用getenv或putenv,因此也没有必要使用该形式。

    没想到吧,仔细数一数竟然有这么种写法?但是真相究竟如何?到底使用哪种呢?

    真相大白

    C89/C99/C11标准文档中只提供了两种main函数的写法

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

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

    也就是说,其他的写法都是不符合标准的,有的是历史遗留问题,有的是编译器扩展,更有的不知从何而来。当然对于带参数的写法,其参数名可自定义。另外对于除标准提供的以外的写法,不同的编译器有不同的处理策略,有的可能编译不过,有的可能报警告,但一个“正经”的编译器是不会对标准提供的形式产生质疑的。

    总结

    至此,我们已经知道了c语言main函数的写法,我们来总结一下前面的内容:

    • C标准只提供了两种main的形式,即前面提到的第三种和第五种。

    • 为了代码的通用可移植性,建议采用标准提供的形式。

    • 不需要命令行参数可采用第三种,需要命令行参数采用第五种。

    • 如果一个函数确定无需传入任何参数,那么用void限定是一个不错的选择。

    • 函数没有声明返回值时,编译器默认其返回值为int。

      

     原文地址:https://www.yanbinghu.com/2018/10/13/3168.html

    欢迎关注公众号[编程珠玑]
  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/bianchengzhuji/p/9783772.html
Copyright © 2011-2022 走看看