Можно ли двигаться назад по списку аргументов getopt_long?

StackOverflow https://stackoverflow.com/questions/3263971

  •  16-09-2020
  •  | 
  •  

Вопрос

Я хотел бы делегировать один из нескольких возможных списков аргументов в зависимости от наличия определенных аргументов, например:

./test --do-thing-1 --option-A=7 --common-option --option-B=2 # options C and D not valid
./test --do-thing-2 --option-C=9 --common-option --option-D=1 # options A and B not valid

И лучший способ, который я могу придумать, чтобы сделать это аккуратно, — это иметь main() обработать все общие параметры и решить, какую из нескольких функций вызвать для обработки оставшихся.

Обратите внимание, что я не хочу ограничивать порядок, чтобы общие параметры могли появляться только первыми.

Моя проблема в том, что если я перезагрузлю optind до 1 перед повторным анализом аргументов, getopt_long segfaults, передав недопустимую строку в strncmp - так что, думаю, мне не стоит возиться с optind.

Я погуглил и не нашел ссылки на то, можно ли прыгать по getopt_long список аргументов (я знаю, что это возможно для getopt), если да, то как это сделать?

Я бы предпочел не использовать какие-либо нестандартные библиотеки.(Язык — простой C, без C++, пожалуйста)

Это было полезно?

Решение

Моя проблема заключалась в том, что я не установил последнюю строку своего static struct option long_options[] массив в нули, правильная установка исправит ошибку.

GNU getopt также требует optind быть сброшен в 0, а не в 1, чтобы правильно сбросить его внутреннее состояние.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top