【问题标题】:getopt does not order arguments in Windowsgetopt 不会在 Windows 中对参数进行排序
【发布时间】:2019-10-17 09:31:41
【问题描述】:

getopt 在 Windows 中的行为似乎与在 Linux 中不同。 Windows 需要严格的参数顺序,而在 Linux 中,我可以按任何顺序放置参数。考虑一个程序 test,它使用为 Linux (gcc) 和 Windows (MinGW) 编译的 getopt,并以这个命令行为例:

test file1.bin file2.bin -o output.txt

Linux 中执行此命令将正确地将 -o output.txt 解析为选项(+参数),无论我将 -o output.txt 放在哪里。它也可能在file1.binfile2.bin 之间,getopt 解析仍然可以正常工作,因为它通过将可选参数放在强制项前面来对参数进行排序。

Windows 中执行此命令会导致解析不正确,在 optind 变量中给我一个错误的索引。似乎在 Windows 中编译时完全相同的代码并没有为我做排序部分。为什么会这样,我们可以解决这个问题吗?

【问题讨论】:

  • GNU getopt() 默认情况下会置换参数(因此选项可以出现在非选项参数之后)。标准 POSIX getopt() 不允许这样做。您可以通过导出 POSIXLY_CORRECT=1 使 GNU getopt() 符合要求。检查 MinGW getopt() 的手册,或 Microsoft 的实现。它可能不会进行排列。然后,您需要安排使用 GNU getopt() 的副本——可能通过获取源代码、编译它并将其包含在您的构建过程中。或者你必须决定 GNU 扩展是不可移植的,因此根本不应该使用。
  • 参见 GNU getopt() 的手册。
  • Linux 中执行此命令将正确解析 -o output.txt 作为选项 这是一个非标准、不可移植的 GNU 扩展POSIX standard argument parsing。 Linux 解析不“正确”。
  • 感谢您澄清排序不是 POSIX 标准。
  • 请将此作为答案并标记以帮助他人。

标签: c gcc mingw getopt


【解决方案1】:

根据要求将我的 cmets 转移到答案。

默认情况下,GNU getopt() 会置换参数(因此选项可以出现在非选项参数之后)。标准 POSIX getopt() 不允许这样做。您可以通过导出环境变量 POSIXLY_CORRECT=1 或使用 + 符号开始 options 参数来使 GNU getopt() 符合 POSIX。

查看 MinGW getopt() 的手册(或来源)或 Microsoft 的实现。鉴于您所看到的,它可能不会进行排列。但是,链接的源代码确实支持排列 - 您需要调查那里发生了什么。

如果您决定使用 GNU getopt(),则需要获取 GNU getopt() 源代码的副本(可能来自 GitHub getopt.c)并将其包含在您的构建过程中。如果你使用它,你至少还需要ansidecl.hgetopt.h,你需要适当地调整配置。

或者你必须决定置换选项的 GNU 扩展是不可移植的,因此根本不应该使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多