getopt 不对 Windows 中的参数排序

getopt does not order arguments in Windows

似乎 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() permutes the arguments (so options can occur after non-option arguments) by default. Standard POSIX getopt() 不允许这样做。您可以通过导出环境变量 POSIXLY_CORRECT=1 或通过使用 + 符号启动 options 参数来使 GNU getopt() 符合 POSIX。

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

如果您决定使用 GNU getopt(),您将需要获得 GNU getopt() 源代码的副本(至少可能来自 GitHub getopt.c) and include it in your build process. If you use that, you'll also need ansidecl.h and getopt.h并且您需要适当地调整配置。

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