【问题标题】:How to use C++ getopt_long() if I have more than 26 options?如果我有超过 26 个选项,如何使用 C++ getopt_long()?
【发布时间】:2011-11-17 14:57:29
【问题描述】:

这是一个相当假设的问题,但假设我有 3 个以相同字母开头的长参数。

--parse or -p
--prune or -r
--pivot or -i

最终我会开始用完有意义的单个字母,而且,很难在 GNU getopt_long() 配置中分配有意义的东西。

{"parase", no_argument,       0, 'p'},
{"prune",  no_argument,       0, 'r'},
{"pivot",  required_argument, 0, 'i'}

在这些情况下,最佳做法是什么?

【问题讨论】:

  • getopt_long_only() 怎么样?

标签: c++


【解决方案1】:

您不必为val 成员使用可打印字符。此外,它是int,而不是char。它应该只是帮助您确定选项。 (意思是,你不必有相应的矮子)。

【讨论】:

  • +1 这是正确答案。这为您提供 sizeof(int) 选项。
  • @qwerty9967, sizeof(int) 并不多 ;-) 它是 2 次方 8*sizeof(int) ;-)
  • @Krelin 它比 52 大很多。你写过一个需要超过 2 个 pow 8*sizeof(int) 选项的程序吗?
  • @qwerty9967,我想说的是,我希望sizeof(int) 在 64 位架构上类似于 4。同样,这并不多。当然,您不必仅仅因为可以就使用所有数以万计的选项。
  • @qwerty9967,简而言之,您的意思可能是 maxint(同样是 1<<(8*sizeof int)),而不是整数的大小(以字节为单位)。
【解决方案2】:

您可以选择大写和小写,为您提供 52 个短选项,但是许多接受长选项的程序甚至不会为某些选项分配短选项,从而迫使用户只使用长选项,没关系。

【讨论】:

  • 你能给出一个只指定长选项的代码示例吗?因为当我查看GNU manual 中给出的示例时,我看不到如何进行切换。谢谢。
  • @wfoolhill GNU tar 例如具有--backup--checkpoint--force-local 和许多其他选项,它们没有等效的短选项。
  • 谢谢,但是GNU tar 使用argp 而不是getopt,而且从它的源代码中很难理解 argp 是如何工作的。不管怎样,我仍然没有找到任何简短的例子来说明如何只使用长选项。
  • @wfoolhill 你不能把 0 作为 struct option 的最后一个字段吗?
  • 如果我遵循 getopt_long example 但我想指定一个带有必需参数(而不是标志)的长选项“param”,gcc 会抱怨,因为“c”在“switch ( c)" 应该是一个字母。查看示例here
【解决方案3】:

数字 0-9 可用于。想象一个数据压缩程序,它要么接受-compression=[0-9],要么只接受-[0-9](不过我不知道这是否适用于getopt)。

另外,也可以使用大写。

我知道这是一个假设性问题,但有这么多选项,程序可能做的太多或需要配置文件。

【讨论】:

    【解决方案4】:

    我建议你看看boost program options。它是一个用于获取命令行参数的通用库。使用起来非常简单愉快。

    【讨论】:

    • 恕我直言,这更像是一个评论而不是一个答案。
    猜你喜欢
    • 2012-02-06
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多