c - getopt 在 Windows 中不对参数进行排序

标签 c gcc mingw getopt

看来 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() 不允许这样做。你可以使 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/

相关文章:

c - 在 64 位 x86 平台上比较 PIE、PIC 代码和可执行文件有什么区别?

c - 在初始化函数以 C 结尾后保留笔画标记

c++ - 为什么 C++ 对函数原型(prototype)(签名)的前向声明更加严格?

c - 在 c 中扫描直到 EOF

C++程序启动并挂起而没有错误

c - 尝试在C中使用宏

python - 如何在 Windows 7 中安装 pywin32 模块

c++ - MinGW 是否足够稳定

qt - Qt Fresh Gui应用程序在启动时崩溃,并在QtCore4.dll上出错

C - 链表的 addLast 函数的奇怪行为