公众号【编程珠玑】:专注但不限于分享计算机编程基础,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

C语言的main函数到底该怎么写的更多相关文章

  1. [ASM C/C++] C语言的main 函数

    C语言有两种可能的运行环境 1. 独立(freestanding) 在独立环境中,C程序执行不需要操作系统的支持,因此只具有最小的链接库能力. 2. 宿主(hosted) 在宿主的环境中,C程序会在操 ...

  2. C#语言基础 Main 函数中的输出输入

    C# 是一门面向对象的编程语言,保留了C  C++等等强大功能,但是它与 Java 非常相似,有许多强大的编程功能,它是微软(Microsoft)专门为.NET应用而开发的一门语言. 也就是人与计算机 ...

  3. linux中c语言编程main函数和参数

    linux下main函数的的标准调用函数的标准形式 int main(int char,char *argv[]) 在main函数的两个参数中,argc必须是整型变量,其是命令行的参数的数目,argv ...

  4. 详解C语言的main函数

    如图所示:#include<stdio.h>这是一个头文件,包含的是C程序运行的C语言的库函数,只有包含了相关的头文件,在程序中才能调用.stdio表示输入输出控制.printf():就是 ...

  5. C#语言基础 Main 函数中变量 整型

    在我们每次上网或者用电脑的时候,请输入你的xxx 或者你的名字(年龄/身高/学校/籍贯)是 在这里我们就要学到一些变量,就是不确定的东西 string a:   //赋予变量 a ="内容& ...

  6. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  7. 从创建进程到进入main函数,发生了什么?

    前几天,读者群里有小伙伴提问:从进程创建后,到底是怎么进入我写的main函数的? 今天这篇文章就来聊聊这个话题. 首先先划定一下这个问题的讨论范围:C/C++语言 这篇文章主要讨论的是操作系统层面上对 ...

  8. C语言中main函数的参数

    转自:http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上, ...

  9. Linux C编程--main函数参数解析

    我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...

随机推荐

  1. lua语言初探

    写在最前面 <cocos2d-x lua核心编程>是我首次购买电子书,坑的就不谈了,书里的代码部分基本上不是少空格就是多换行,让阅读变得十分困难. 所以又购买了实体书,加上看一些大佬视频和 ...

  2. 从零开始学安全(三)●黑客常用的windows端口

    端口可选1-65536 1-1024 预保留端口 留给windows系统服务的 下面是常见的端口对应的服务 1 TCP Port Service Multiplexer 传输控制协议端口服务多路开关选 ...

  3. sql查询语句时怎么把几个字段拼接成一个字段

    sql查询语句时怎么把几个字段拼接成一个字段SELECT CAST(COLUMN1 AS VARCHAR(10)) + '-' + CAST(COLUMN2 AS VARCHAR(10) ...) a ...

  4. spring_01概念及案例

    1.什么是IOC? IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContex ...

  5. 【模板小程序】任意长度非负十进制数转化为二进制(java实现)

    妈妈再也不用担心十进制数过大了233(注意只支持非负数) import com.google.common.base.Strings; import java.math.BigInteger; imp ...

  6. python基础学习(二)注释和算术运算符

    注释 1. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程 ...

  7. Python3 系列之 面向对象篇

    面向对象的三大特性:继承.封装和多态 Python 做到胶水语言,当然也支持面向对象的编程模式. 封装 class UserInfo(object): lv = 5 def __init__(self ...

  8. 持续集成 自动化构建、测试、部署您的Coding代码

    持续集成(Continuous Integration)指的是,频繁地(一天多次)将代码集成到主干. 持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量. 它的核心措施是,代码集成到主干之前, ...

  9. C# % 和 /

    /相当于整数除法中的除号,%相当于余号5 除以 2 = 2 余 1,因此 5/2=2,5%2=1.

  10. JavaScript 基础(一) - JavaScript的引入方式,JavaScript 变量命名规则,JS 的五种基本数据类型,ECMAScript 算数运算符,逻辑运算符

    JavaScript的引入方式 直接编写 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...