Можно ли двигаться назад по списку аргументов getopt_long?
-
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, чтобы правильно сбросить его внутреннее состояние.