Можно ли перемещаться назад по списку аргументов getopt_long? - PullRequest
0 голосов
/ 16 июля 2010

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

./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 завершится ошибкой, передав недопустимую строку в strncmp - поэтому я не должен связываться с optind.

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

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

1 Ответ

1 голос
/ 16 июля 2010

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

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

...