【发布时间】: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.bin 和file2.bin 之间,getopt 解析仍然可以正常工作,因为它通过将可选参数放在强制项前面来对参数进行排序。
在 Windows 中执行此命令会导致解析不正确,在 optind 变量中给我一个错误的索引。似乎在 Windows 中编译时完全相同的代码并没有为我做排序部分。为什么会这样,我们可以解决这个问题吗?
【问题讨论】:
-
GNU
getopt()默认情况下会置换参数(因此选项可以出现在非选项参数之后)。标准 POSIXgetopt()不允许这样做。您可以通过导出POSIXLY_CORRECT=1使 GNUgetopt()符合要求。检查 MinGWgetopt()的手册,或 Microsoft 的实现。它可能不会进行排列。然后,您需要安排使用 GNUgetopt()的副本——可能通过获取源代码、编译它并将其包含在您的构建过程中。或者你必须决定 GNU 扩展是不可移植的,因此根本不应该使用。 -
参见 GNU
getopt()的手册。 -
在 Linux 中执行此命令将正确解析 -o output.txt 作为选项 这是一个非标准、不可移植的 GNU 扩展POSIX standard argument parsing。 Linux 解析不“正确”。
-
感谢您澄清排序不是 POSIX 标准。
-
请将此作为答案并标记以帮助他人。