命令行参数
main 函数有没有参数,可不可以带参,如果可以最多可以带几个参数 ❓
咦!好奇怪。在 C/C++ 中写了这么多 main 函数从来没有写过带参的。实际 main 函数是可以带参的,可以带 3
个参数。
其中int argc
是命令行参数的个数;char* argv[]
是指针数组,数组里有几个有效元素是由argc
确定,所以 main 函数的前两个参数用来记录的是我们在命令行上传入的参数,我们称这两个参数为命令行参数
。
为什么要存在命令行参数 ❓
在 Windows 下是感受不到的。比如这里我们要实现加减法计算器./cal -add 3 5
、./cal -sub 3 5
,那么它有4
个argc
。
有人说这也体现不了命令行参数有啥价值呀。可以看到下图,ls 命令根据不同的选项可以完成不同的功能,这就是命令行参数最大的价值。所以为什么我们在大部分 C/C++ 代码中不用命令行参数的原因是你的 main 函数只有一种功能。
比如 Windows 下shutdown
命令,而因为命令行参数的作用,所以它能根据不同选项完成不同功能。
在 C语言里,我们学习函数栈帧时,说过 main()
是被 __tmainCRTStartup()
调用的,__tmainCRTStartup()
最后是被操作系统调用的,其中 main
函数的参数是在 __tmainCRTStartup()
调用 main
函数时就传入了,Linux 下也是如此,
char* env[] ❓
char* env[]
是 main 函数的第 3 个参数,它和第 2 个参数的类型一样都是指针数组。但是 env 的每个元素是环境变量。换言之,我们把环境变量的路径作为字符串,用char* env[]
这样的字符指针数组,依次指向不同的环境变量,我们就可以通过数组传参的方式,把环境变量传递给当前程序,当前程序运行后成为进程,也就意味着进程拿到了环境变量。
可以看到这里打出来的环境变量几乎是和bash
的环境变量一模一样,说明环境变量的继承是通过第三个参数char* env[]
来继承的。
💦 通过代码如何获取环境变量
-
命令行第三个参数。
详见如上
char* env[]
。
-
getenv。
现在我们就明白了
getenv("PATH")
的原理其实就是在 env 里,进行文本匹配,找到PATH
对应的内容返回。 -
通过第三方变量
environ
获取。在 C 中想获取环境变量,可以使用 C 提供的全局变量 —— environ。
libc
中定义的全局变量environ
指向环境变量表,environ
没有包含在任何头文件中,所以在使用时要用extern
声明。
帮助理解 ???
咦!这有点接受不了了,难道学了个假的 C语言吗,这其实是些冷门知识。实际 10 和 20 确实是传给了 show,只不过你没有办法使用,其中如果你曾经了解过函数调用时会形成栈帧,那么就知道 10 和 20 会被压入 show 这个栈帧中,换句话说,我们在 show 里是可以使用某些指针操作得到 10 和 20 的。同理 main 函数虽然没有明确写带参,但同样也可以把 argc、argv、env 传参,同样这里的二级指针也可以通过某种方式,在压栈结构中,让 environ 指向传入的命令行参数。
- 点赞
- 收藏
- 关注作者
评论(0)