c - GNU argp : How to parse option with only long name?

标签 c arguments command-line-arguments argp

我想使用argp在我的 C 程序中解析命令行选项。

一个要求是选项没有短名称(如 -f bar),而只有长名称(如 --foo=bar)。

到目前为止,我的方法是将 argp_option 结构的 key 字段设置为 0 以使其不显示短名称。

我看过the provided examples和 argp.h 详细信息,但我找不到一种方法来解析仅在赋予 argp 的解析器函数中具有长名称的选项。

我确实发现,理论上,在解析器中我可以使用

case ARGP_KEY_ARG:
  printf("%s\n", arg);

查找长选项的(例如,当使用--foo=bar调用时,bar将打印在此处)。但是,这似乎不是正确的方法,因为我没有看到一种简单的方法来实际判断该值属于哪个选项。这也显示了实际的命令行参数(不是选项值)。

如果您提供有关我需要查看的位置的提示,我将不胜感激。干杯。

最佳答案

来自"The GNU C Library: Argp Option Vectors — Specifying Options in an Argp Parser" :

int key

The integer key provided by the current option to the option parser. If key has a value that is a printable ASCII character (i.e., isascii (key) is true), it also specifies a short option -char, where char is the ASCII character with the code key.

换句话说,选项的 key 字段可以是任何 int 值,如果 isacii(key) 不为零,则它还指定了一个短选项,这意味着您可以使用非 ASCII 值(0x00..0x7F 范围之外的值)来避免短选项。尽管不是短选项,key 的值仍然用作关联的长选项的值(例如 --foo),因此您可以这样处理它:与任何键/短选项相同。

O/T:我将所有选项键作为常量收集在 enum 中,因此我不知道 0x100switch 中代表什么选项,例如对于 GNU tar,它的压缩选项可能是这样的:

enum compress_options {
    // Archive file extension determines compression program
    COMP_FILTER_AUTO = 'a',
    // Option arg is program used to deal with compression
    COMP_FILTER_ARG = 'I',

    COMP_FILTER_BZIP2 = 'j',
    COMP_FILTER_XZ = 'J',
    COMP_FILTER_GZIP = 'z',
    COMP_FILTER_COMPRESS = 'Z',

    COMP_FILTER_LZIP = 0x100,
    COMP_FILTER_LZMA,
    COMP_FILTER_LZOP,

    // Do not use archive suffix to determine compression program.
    COMP_FILTER_NOAUTO,
};

然后您只需确保下一组选项使用 0x200,然后使用 0x300 等,以避免具有相同值的选项出现问题。如果需要,您还可以使用 0x1000x1800x2000x280 等(例如 >0x100 可能代表一个子命令,0x180 可能是该子命令的第一个选项)。

将空头期权和非空头期权分开分组非常重要。枚举中隐式分配的值取决于最后一个显式分配的值。如果我将 COMP_FILTER_NOAUTO 紧跟在 COMP_FILTER_AUTO 之后,--no-auto-compress 长选项将有一个关联的短选项 -b ,但实际上并非如此。

关于c - GNU argp : How to parse option with only long name?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47727755/

相关文章:

c - gdb -- 没有名为 <something> 的源文件 - 英特尔编译器

c++ - vector vector 的段错误

c - 求最小值没有指针的多个矩阵中的值

bash - 如何解析 Bash 中的命令行参数?

java - 在 Java 中将字符串转换为 SomeType

java - 使用 JCommander 的参数选项

c - 在C中使用 'select()'为多客户端进行套接字编程

javascript - 在函数中使用参数对象

python - 将 varargin 和 nargin 从 Matlab 转换为 Python

c - 从两个输入文件读取字符时如何修复 'Segmentation Fault(core dumped)' 错误?