欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 50、【OS】【Nuttx】【OSTest】参数解析:函数定义

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

2025/5/2 21:43:35 来源:https://blog.csdn.net/nobigdeal00/article/details/146466528  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词