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

51、【OS】【Nuttx】【OSTest】参数解析:参数处理过程

背景

接上两篇 blog:
49、【OS】【Nuttx】【OSTest】参数解析:测试项
50、【OS】【Nuttx】【OSTest】参数解析:函数定义

getopt_common

来看 getopt_common 的实现过程
在这里插入图片描述

  • 首先校验输入参数是否为空,如果没有输入参数,则没必要进行解析,这里应该用卫语句来进行校验,可以减少圈复杂度;另外,这里判断 go_optind 是否小于 1 有点多余,因为首先没看到程序中有对 go_optind 进行清零操作的地方,其次 go_binitialized 在参数解析结束时会自动设置为 false,用 go_binitialized 对是否需要初始化判断已经足矣。

在这里插入图片描述

  • 初始化完之后,接下来判断是否正在进行一个新的选项解析,上篇 blog 提到 go_optptr 为内部指针,指向当前正在解析的选项字符串的字符位置,如果 go_optptr 为空,说明此时为首次进行参数解析,如果 *go_optptr 为 \0,说明当前的选项已经解析完,可以开始下一个选项的解析
  • 如果 go_optptr 不为空,说明不是首次解析,此时由于 *go_optptr 为 \0,说明当前选项已经解析完,开始执行下一选项解析(go_optind++)
  • 如果索引超出选项个数 argc,则参数解析结束;或者发现选项中第一个字符不是 ‘-’,参数解析也结束,因为语法不对
  • 如果选项没解析完,且语法也正确,则跳过第一个字符 ‘-’,进行后续字符的解析

在这里插入图片描述
特殊处理只有一个 ‘-’ 或者 ‘-:’ 的情况,这两种都属于异常情况,解析模块需要跳过异常选项,进行下一轮解析
在这里插入图片描述
检查是否为长选项解析模式,这里 long_mode 和 long_only_mode 都会进入该分支,如果下一个字符也是 ‘-’,说明为 long_mode,跳过字符 ‘-’,进行长选项解析 getopt_long_option

在这里插入图片描述
从 getopt_mode_e 类型定义可以看到,long_mode 和 long_only_mode 都有 GETOPT_LONG_BIT
在这里插入图片描述

如果不是 long_mode,接下来判断是不是 long_only_mode,如果为 long_only_mode,进行长选项解析 getopt_long_option,如果遇到未识别的长选项(可能是选项不匹配,或者选项的参数不匹配),将跳过该选项,进行下一轮选项解析
在这里插入图片描述
进行完长选项解析后,再进行短选项解析,这里如果 optstring(合法短选项)为空,在长选项模式中,将跳过该选项,进行下一轮选项解析;如果是短选项模式,将直接结束参数解析(因为没有合法的短选项进行参考)
在这里插入图片描述

  • 首先看 optstring (合法短选项)第一个字符是不是冒号,如果是冒号,说明前面还少了一个选项参数,并跳过这个冒号
  • optstring 的类型为 const char *,解引用后得到的是一个字符,而非字符串
  • strchr 判断该选项是否为合法字符串,如果 optchar 为空,说明该选项为非法选项,将跳过该选项进行下一轮选项解析

在这里插入图片描述

  • optchar[0] 为合法短选项,接下来看 optchar[1] 是不是冒号,如果非冒号,说明该选项不带参数
  • 如果为冒号,首先正常情况下,选项和选项所带的参数是分开的,比如选项 -a 是 argv[0],但选项 -a 带的参数在 argv[1],那么解析完该选项及其参数,需要两轮解析,也就是调用 getopt_common 两次
  • 这里考虑了一种特殊的情况,选项和参数混在一起,此时,从理论上,解析完这个选项参数,只需要一轮,也就是这里的条件分支,但实际上很少有人这么用,所以这里先不考虑这种场景

在这里插入图片描述
如果下一个待解析项不是 ‘-’ 开头,那么默认它为该选项的参数,此时返回该参数出去,optind 索引增加 2(选项 + 参数),否则就是不带参数,此时根据该选项参数是不是必须的,决定是返回该选项,还是 ‘?’

http://www.xdnf.cn/news/257833.html

相关文章:

  • 代码随想录算法训练营第60期第二十二天打卡
  • WindowsPE文件格式入门10.TLS表
  • 单词规律(简单)
  • 数字智慧方案6217丨智慧园区建设方案V40(46页PPT)(文末有下载方式)
  • 酷我音乐全歌曲免费版
  • JAVA继承详细总结
  • 敏感词 v0.25.1 新特性之返回匹配词,修正 tags 标签
  • 数字智慧方案5876丨智慧交通枢纽智能化系统建设方案(56页PPT)(文末有下载方式)
  • 前端面试每日三题 - Day 22
  • 藏文文本自动分词工具学习实践
  • 移动端开发中设备、分辨率、浏览器兼容性问题
  • Linux操作系统--进程间通信(中)(命名管道)
  • DeepSeek实战--Function Calling
  • Java 京东面试面试题及答案
  • 用Selenium开启自动化网页交互与数据抓取之旅
  • Linux管道识
  • 阿里通义千问 Qwen3 模型发布
  • 学习笔记:Qlib 量化投资平台框架 — OTHER COMPONENTS/FEATURES/TOPICS
  • 【2025年五一数学建模竞赛】C题 完整论文 模型建立与求解
  • 数据库索引优化实战: 如何设计高效的数据库索引
  • 「Mac畅玩AIGC与多模态14」开发篇10 - 固定文本输出工作流示例
  • 算法篇(九)【滑动窗口】
  • 题解传送门
  • SpringBoot商城平台系统设计与开发
  • 网络管理工具 iptable 详解
  • 第 7 篇:跳表 (Skip List):简单务实的概率性选手
  • 深度理解linux系统—— 进程切换和调度
  • 系统架构设计师:设计模式——结构型设计模式
  • 全国信息素养大赛 图形化挑战赛~复赛练习-在正方形内吗?
  • Python基本语法(自定义函数)