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.bin
和 file2.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 扩展不可移植,因此根本不应使用。
似乎 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()
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 扩展不可移植,因此根本不应使用。