C语言 在GNU argp中将'?'键替换为'h'键

zsbz8rwp  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(150)

我使用argp.h库来解析程序的命令行参数。
我设置了一点,它的工作,但只是有一件事我不喜欢。
当我用--help运行我的程序时,它显示如下:

-?, --help                 Give this help list
    --usage                Give a short usage message
-V, --version              Print program version

这是正确的,但是为什么--help的缩写是-??是否可以指定一个不同的键,比如-h和一个宏?
我看了一下docs,但我没有找到任何有关这方面的信息,除了可能定义一个自定义键,但我不喜欢这种方法或更好,我不知道这是否是首选的方式。

yjghlzjz

yjghlzjz1#

通过深入研究,我们发现了'?'被定义为默认帮助功能的短选项的位置。
在源中没有太大的损失,当启用默认帮助时,用户的 * argp * 和默认 * argp *(以及版本 * argp *(如果适用))被分组为同级(另请参见:children),然后解析程序参数。在此之前似乎没有用于更改默认值的接口,因为short选项是硬编码的。
通过将ARGP_NO_HELPflag传递给argp_parse,可以关闭默认的帮助/用法选项。
argp_state_help可用于使用各种flags复制默认选项的行为。默认选项使用的标志包括:

  • --helpARGP_HELP_STD_HELP
  • --usageARGP_HELP_USAGE | ARGP_HELP_EXIT_OK

其中ARGP_HELP_EXIT_OK的结果为exit(0)
如果不使用argp_program_version_hook,则--version的行为只是打印argp_program_version
举个粗略的例子:

#include <argp.h>
#include <stdio.h>
#include <stdlib.h>

#define USAGE 0x123

const char *argp_program_version = "example 1.0";
const char *argp_program_bug_address = "<so@example.com>";

static struct argp_option options[] = {
    { "help", 'h', 0, 0, "show this message", -1 },
    { "version", 'V', 0, 0, "show version", -1 },
    { "usage", USAGE, 0, 0, "show usage", 0 },
    { 0 }
};

static error_t parse_opt(int key, char *arg, struct argp_state *state)
{
    switch (key) {
        case 'h':
            argp_state_help(state, state->out_stream, ARGP_HELP_STD_HELP);
            break;
        case USAGE:
            argp_state_help(state, state->out_stream, ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);
            break;
        case 'V':
            fprintf(state->out_stream, "%s\n", argp_program_version)
            exit(0);
            break;
        default:
            return ARGP_ERR_UNKNOWN;
    }

    return 0;
}

int main(int argc, char **argv)
{
    struct argp argp = { options, parse_opt };
    argp_parse(&argp, argc, argv, ARGP_NO_HELP, 0, NULL);
}

相关问题