看来 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()
默认情况下排列参数(因此选项可以出现在非选项参数之后)。标准 POSIX getopt()
不允许这样做。你可以使 GNU getopt()
通过导出环境变量 POSIXLY_CORRECT=1
来符合 POSIX ,或通过启动 options
与 +
的争论符号。
检查 MinGW 的手册(或来源) getopt()
,或者它的 Microsoft 实现。鉴于您所看到的,它可能不会进行排列。然而,链接的源代码确实支持排列——您需要调查那里发生了什么。
如果您决定使用 GNU getopt()
,您需要获取 GNU getopt()
的副本源代码(可能来自 GitHub getopt.c
)并将其包含在您的构建过程中。如果您使用它,您还需要 ansidecl.h
和 getopt.h
至少,您将需要适当调整配置。
或者您必须确定排列选项的 GNU 扩展不可移植,因此根本不应该使用。
关于c - getopt 在 Windows 中不对参数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58429368/