当前位置: 首页 > news >正文

50、【OS】【Nuttx】【OSTest】参数解析:函数定义

背景

接上篇 blog
49、【OS】【Nuttx】【OSTest】参数解析:测试项
下面来分析参数解析的函数实现

解析函数

首先,短选项的解析函数从测试函数中可看出来是 getopt
在这里插入图片描述
而长选项的解析函数为 get_long
在这里插入图片描述
允许单短划线表示长选项的解析函数为 getopt_long_only
在这里插入图片描述

getopt

来看下 getopt 定义的描述
在这里插入图片描述
下面来解释下逐段的关键含义:

  • getopt 解析命令行参数,参数通过 argv,argc 传入 main 主函数,参数前面有字符 ‘-’,当 getopt 被反复调用时,将逐个返回传入的参数选项
  • 如果 getopt 找到了一个选项,将返回这个选项,并更新一个外部变量(全局变量)optind(指向当前正在解析的选项) 和一个静态变量 nextchar(其实这里不叫 nextchar,而是 optptr,指向当前选项正在解析的字符),其实也好理解,这里 argv 是个二维数组 array[x][y],optind 相当于 x,optptr 相当于 y
  • 如果没有选项可以解析,或者选项已经解析完,getopt 将返回 -1;optstring 入参为合法选项字符数组,如果有字符后面接着冒号:,代表这个选项需要一个参数

getopt_long

getopt_long 定义描述如下
在这里插入图片描述
getopt_long 和 getopt 类似,区别是 getopt_long 比 getopt 多了两个长选项的入参 longopts 和 longindex,其中 longopts 作用和 optstring 类似,里面包含了合法的长选项范围,longindex 是返回该长选项在合法长选项中的位置,可以填空

getopt 的函数定义如下,可见比 getopt_long 少了两个参数
在这里插入图片描述

getopt_long_only

在这里插入图片描述
getopt_long_only 和 getopt_long 类似,只不过一个短斜杠 ‘-’ 可以代表长选项,而不需要两个短斜杠,如果一个短斜杠没有匹配的长选项,但是有一个匹配的短选项,那么将会相应的替代为那个短选项

getopt_common

对于 getopt_common,定义如下
在这里插入图片描述
这里 go 是 getopt 的缩写,指向一个管理参数解析状态的全局变量
在这里插入图片描述
getopt_s 类型的定义如下,主要为两部分构成,一部分是公共接口部分(外界可通过该部分获取参数解析的结果),另一部分为内部状态部分(该部分为参数解析模块内部使用)
在这里插入图片描述
公共接口部分:

  • go_optarg:指向当前选项的可选参数的指针,如果某个选项后面需要附加参数(比如 -f filename 中的 filename),go_optarg 会指向这个参数的字符串
  • go_opterr:打印错误信息(Nuttx 这里暂不支持)
  • go_optind:当前正在解析的命令行参数在 argv 数组中的索引位置,初始值一般是 1(从 argv[1] 开始解析,argv[0] 是程序名字),随着解析进行,go_optind 会递增
  • go_optopt:遇到无法识别的选项时,会将该选项的字符存储在此变量中,可以用来检测处理不支持的选项

内部状态部分:

  • go_optptr:内部指针,指向当前正在解析的选项字符串的位置,用来跟踪解析过程中的具体位置(参数解析过程是逐个字符比对解析的,不是整个字符串一下就解析完成)
  • go_binitialized:解析模块是否已经初始化就绪,如果为 true,说明 getopt() 已经完成初始化,可以开始解析命令行参数,解析过程结束后,该变量会重置为 false
http://www.xdnf.cn/news/248707.html

相关文章:

  • 当算力遇上堵车:AI如何让城市血管不再“血栓”?
  • OpenStack Yoga版安装笔记(25)Nova Cell理解
  • 黑马Java基础笔记-6
  • 伽利略如何测量光速?一场跨越山头的失败实验
  • VBA数据结构深度解析:基础类型、自定义类型与数组操作指南
  • Dagster资产工厂实战:从Python到YAML配置的高效ETL流程
  • 408真题笔记
  • 第十三章:LLM 应用质量保证:评估体系、工具与实战
  • 深入解析三大查找算法:线性查找、二分查找与哈希查找的原理与应用
  • 进程(Process)和操作系统(Operation System)
  • ctfshow web入门 web46
  • 用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
  • pandas读取Excel数据(.xlsx和.xls)到treeview
  • JavaScript如何实现类型判断?
  • C语言 指针(2)
  • spring-cloud-alibaba最新版本聚合项目创建
  • 机器学习Day15 LightGBM算法
  • 探秘数据结构:构建高效算法的灵魂密码
  • GD32F407单片机开发入门(二十二)红外避障传感器模块实战含源码
  • 项目经验不够被拒3次?
  • 电流测量 I/V转换
  • 前端vue3项目学习
  • python3基础
  • 数位 DP 的关键
  • ProCCD:复古CCD相机应用,重现经典胶片感
  • 2025年五一杯数学建模竞赛赛题浅析-助攻快速选题
  • 深入探讨宾馆一次性牙刷价格,市场价格区间差异大
  • esp32cam开发板的引脚使用和测试
  • 注册登录页面项目
  • dify+ollama+知识库 部署