getopt не упорядочивает аргументы в Windows - PullRequest
0 голосов
/ 17 октября 2019

Кажется, что getopt ведет себя иначе в Windows, чем в Linux. В Windows требуется строгий порядок параметров, а в Linux я могу расположить аргументы в любом порядке. Рассмотрим программу test, которая использует getopt, скомпилированную для Linux (gcc) и Windows (MinGW), и возьмем следующую командную строку, например:

test file1.bin file2.bin -o output.txt

Выполнение этой команды в Linux будет правильно проанализировать -o output.txt как параметр (+ параметр) независимо от того, куда я положил -o output.txt. Это также может быть между file1.bin и file2.bin, и getopt синтаксический анализ будет по-прежнему работать правильно, поскольку он сортирует аргументы, помещая необязательные аргументы перед мандаториями.

Выполнение этой команды в Однако Windows приводит к неправильному синтаксическому анализу, что приводит к неверному индексу в переменной optind. Кажется, что точно такой же код при компиляции в Windows не выполняет для меня часть сортировки. Почему это, мы можем обойти это?

1 Ответ

1 голос
/ 21 октября 2019

Передача моих комментариев в ответ на запрос.

GNU getopt() переставляет аргументы (поэтому варианты могут появляться послеаргументы) по умолчанию. Стандарт POSIX getopt() не позволяет этого. Вы можете привести GNU getopt() в соответствие с POSIX, экспортировав переменную среды POSIXLY_CORRECT=1 или начав аргумент options с символа +.

Проверьте руководство (или источник) для MinGW getopt(), или его реализация Microsoft. Учитывая то, что вы видите, он, вероятно, не делает перестановку. Однако связанный исходный код поддерживает перестановку - вам нужно выяснить, что там происходит.

Если вы решите использовать GNU getopt(), вам необходимо получить копию исходного кода GNU getopt() (возможно, из GitHub getopt.c) и включить его вваш процесс сборки. Если вы используете это, вам также понадобятся ansidecl.h и getopt.h как минимум, и вам нужно будет соответствующим образом настроить конфигурацию.

Или выПридется решить, что расширение перестановочных опций GNU не является переносимым и поэтому не должно использоваться вообще.

...