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