来自“GNU C 库:Argp 选项向量 — 在 Argp 解析器中指定选项”:
int key
key
当前选项提供给选项解析器的整数。如果key
有一个值是可打印的 ASCII 字符(即为
isascii (key)
真),它还指定一个短选项-char
,其中char
是带有代码的 ASCII 字符key
。
换句话说,key
选项的字段可以是任何int
值,如果isascii(key)
不为零,那么它还指定了一个短选项——这意味着您可以使用非 ASCII 值(范围之外的值0x00
.. 0x7F
)来避免短选项。尽管不是短选项,但 的值key
仍用作相关长选项的值(例如--foo
),因此您可以像处理任何键/短选项一样处理它。
O/T:我将我所有的选项键都收集在一个enum
常量中,所以我不知道0x100
在 a 中代表什么选项switch
,例如对于 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
, then0x300
等,以避免选项具有相同值的问题。如果需要,您还可以使用0x100
, 0x180
, 0x200
,0x280
等(例如,0x100
可能代表一个子命令并且0x180
可能是该子命令的第一个选项)。
将空头期权和非空头期权分开分组很重要。an 中的隐式赋值enum
取决于最后一个显式赋值的值。如果我在COMP_FILTER_NOAUTO
之后立即放置COMP_FILTER_AUTO
,--no-auto-compress
多头期权将有一个相关的空头期权-b
,但实际上并没有。