命令行参数

举报
跳动的bit 发表于 2022/08/30 07:37:47 2022/08/30
【摘要】 main 函数有没有参数,可不可以带参,如果可以最多可以带几个参数 ❓  咦!好奇怪。在 C/C++ 中写了这么多 main 函数从来没有写过带参的。实际 main 函数是可以带参的,可以带 3 个参数。  其中int argc是命令行参数的个数;char* argv[]是指针数组,数组里有几个有效元素是由argc确定,所以 main 函数的前两个参数用来记录的是我们在命令行上传入的参数,我...

main 函数有没有参数,可不可以带参,如果可以最多可以带几个参数 ❓

在这里插入图片描述

  咦!好奇怪。在 C/C++ 中写了这么多 main 函数从来没有写过带参的。实际 main 函数是可以带参的,可以带 3 个参数。

  其中int argc是命令行参数的个数;char* argv[]是指针数组,数组里有几个有效元素是由argc确定,所以 main 函数的前两个参数用来记录的是我们在命令行上传入的参数,我们称这两个参数为命令行参数

为什么要存在命令行参数 ❓

  在 Windows 下是感受不到的。比如这里我们要实现加减法计算器./cal -add 3 5./cal -sub 3 5,那么它有4argc

在这里插入图片描述
  有人说这也体现不了命令行参数有啥价值呀。可以看到下图,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[]来继承的。

💦 通过代码如何获取环境变量

  1. 命令行第三个参数。

    详见如上char* env[]
    在这里插入图片描述

  2. getenv。

    现在我们就明白了getenv("PATH")的原理其实就是在 env 里,进行文本匹配,找到PATH对应的内容返回。

  3. 通过第三方变量environ获取。

    在 C 中想获取环境变量,可以使用 C 提供的全局变量 —— environ。libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
    在这里插入图片描述
    帮助理解 ???

  咦!这有点接受不了了,难道学了个假的 C语言吗,这其实是些冷门知识。实际 10 和 20 确实是传给了 show,只不过你没有办法使用,其中如果你曾经了解过函数调用时会形成栈帧,那么就知道 10 和 20 会被压入 show 这个栈帧中,换句话说,我们在 show 里是可以使用某些指针操作得到 10 和 20 的。同理 main 函数虽然没有明确写带参,但同样也可以把 argc、argv、env 传参,同样这里的二级指针也可以通过某种方式,在压栈结构中,让 environ 指向传入的命令行参数。

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。