GNU C Arg Parser对带必填参数选项解析异常是bug吗?
这不是bug,是GNU Argp遵循的默认命令行参数规范
- GNU生态的命令行参数解析默认遵循「不阻止以
-开头的字符串作为选项参数」的规则,因为存在大量合法场景需要支持这种用法:比如参数本身是负数、文件名确实以-开头、或者自定义参数格式要求前缀带-。你遇到的-v被识别为-o的参数是符合设计预期的行为。 - Python的argparse默认开启了「禁止其他选项作为前序选项的参数」的校验逻辑,这个校验是argparse额外做的,不是命令行参数解析的通用默认规则。
你可以测试常见的GNU工具验证这个逻辑:比如执行
touch -- -v创建一个名为-v的文件,再执行对应支持-o参数的工具命令[工具名] -o -v,会正常把-v作为-o的参数处理,不会报错。
如果你需要实现和Python argparse一致的校验逻辑,自行添加判断即可
在你编写的argp选项回调处理函数中,对带参数的选项增加一层校验:如果拿到的参数值符合选项格式,就主动抛出参数错误即可,示例逻辑如下:
static error_t parse_opt (int key, char *arg, struct argp_state *state) { struct arguments *arguments = state->input; switch (key) { case 'o': // 自定义校验:禁止参数为短选项格式 if (arg && arg[0] == '-' && strlen(arg) == 2 && isalpha(arg[1])) { argp_error(state, "option -o requires a non-option argument"); } arguments->output_file = arg; break; // 其余选项处理逻辑 } return 0; }
内容的提问来源于stack exchange,提问作者Jirka
相关产品推荐
相关产品推荐

