c语言sinx怎么表示_随时随地学习C语言之2—main函数的参数argc和argv是啥?

本文讨论下C语言main函数怎么来的?它的参数argc和argv是什么?

main函数的由来:main函数是C语言的入口函数,在嵌入式当中,其实就是启动代码(通常是.s文件)进行工作“交接”的下一级,由于刚一上电(或者刚运行程序)的时候,PC也好、MCU也好,应用程序(如果是高级语言的话)的运行环境还没有建立(主要是高级语言运行所必须的内存空间环境,比如栈、堆等等),所以刚开始需要由汇编语言来将C语言(或其他高级语言)运行所必须的空间环境建立起来,相应的运行环境建立完成后,启动代码的任务就完成了(有可能还需要启动代码将可执行代码拷贝到内存中),需要将CPU的使用权交给用户的应用程序,这其实就是一个简单的函数调用,为了防止大家每次运行都需要修改启动代码,相关组织约定俗成的将启动代码的“接手”规定为main。简而言之,启动代码调用我们源代码中的main函数,就开始执行我们的应用程序了。

根据上面的介绍,各位童鞋可以思考一下,如果没有main函数会发生什么?这就好比我们的程序调用了一个没有的函数,会发生什么?我们根据下图所示代码测试一下:

dbaa6537f5a0e618a493b00082ecca2c.png

点击编译,编译器输出结果如下:

3a18fabac849202ad57b22d5e9124d29.png

图中报错:对未定义'function'的引用(即调用的function未定义)。而且,根据第二行我们也可以知道,这个错误是由工具链中的链接器抛出的(有关工具链中各个工具的使用及作用,我会抽一节专门介绍)。

很多朋友在学习C语言的时候,经常会看到C语言的入口函数main有多种写法:

dc7e1851806979014e9ba42bcb2b4f4a.png

上面那种写法对呢?其实都对!是不是颇感奇怪?

上面这些写法,其实都可以通过编译(即没有错误),而且也都可以正常运行(如果不需要参数传递的话)。

代码这东西,其实除了对错,还有一层约束,就是“是否规范”。合格的程序猿,不仅要保证程序编译没有报错、执行正常,还要保证编译时没有一个警告!上面这4种写法,若论规范性,如果标准不同(平台不一样,即编译器不同)其实也没有最为规范的一种。是不是很无奈?其实学习就是这样,不仅要有严谨性,还要有针对性。尤其是对C语言这种和底层关联性比较强的语言,要不然怎么能说C语言是高级语言中的低级语言呢。

要想将问题说清楚,首先要说明白main函数的组成部分,C语言当中,任何函数都由3部分组成:返回值、函数名、形参,我们就拿第1种写法来解释一下:

637513a43f83c4348718d19b5ce81795.png

返回值:是一个函数对外输出的接口,第1种写法void表示没有返回值;第2/3/4种写法int表示返回值的类型为int型(即整型)。

函数名:表示一个函数的名称,这个没什么好说的,说白了,就是给函数起一个名。起名要遵守一定的规则,比如不能包含中文、只能字母或下划线开头、可以包含字母、数字、符号等。

形参:返回值是函数对外的接口,形参就是外部对函数的接口,是函数接收外部传递进来的参数的“桥梁”。

一个函数的组成部分说明白了,下面就来解释下这4种写法(只针对main函数)分别适用什么情况。

第1种写法:返回值、形参都为空,适用的情况是用户程序无需系统或启动代码给传递参数、无需输出的情形。这种写法,一般在比较低级MCU的编译器上不会抛出警告,前面说过了,这4种写法都可以通过编译(即没有错误)。在一些比较现代、高级的编译器上(尤其是PC),返回值为空的写法,都会抛出警告,这是由于操作系统调用了main函数开始执行用户程序,需要接收main函数的一个返回值来判断用户程序的退出状态,是正常执行结束、还是出现错误退出的,错误代码是多少?后面的linux应用开发系列,我会详细介绍这点。

第2种写法:有返回值、无形参。如果用户不需要向main函数传递参数,这种写法,无论PC还是嵌入式平台,都是不会抛出警告的,由于我们大多数情况不需要向main函数传参,所以这种写法适应范围最广。

第3/4种写法:嵌入式中,如果不是启动代码要做一些安全之类的检查、必须向main函数传递参数的话,几乎不会用到这两种写法。如果只是单个程序运行,不需要“程序启动程序”的话,这两种写法也可以用第2种写法代替。

那么,第3/4种写法种的argc、argv两个参数到底代表什么?有什么作用?

argc(argument count):向main函数传递的参数的个数

argv(argument vector):保存着向main函数传递的每个参数的指针

为了详细搞懂第3/4种写法的用处,我还是用代码说话吧:

48d188eecfa06501df6a3ad4e8adbfa0.png

点击运行程序,然后通过cmd控制台进入该文件夹,输入如下参数:

6646fa327331b6c9eade68df0385104c.png

结果看到了吧,输入的参数为“hello 1 2 3 4”加上命令test.exe总共为6个,argv[0]~argv[5]的值如上图所示。

相信通过上述讲解已经可以理解argc和argv的作用了吧,这种传参方式现在用到的不是很多了,尤其是在win平台下,除非在一些用户程序无法操作或者很难操作的场景才会应用这两个参数。不过linux下面这两个参数可是用的很频繁呦,配合linux命令行,既简单又灵活。可以这么理解,这两个参数,属于C语言历史遗留下来的“福利”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值