Est-il possible de revenir en arrière dans une liste d'arguments getopt_long ?
-
16-09-2020 - |
Question
Je voudrais déléguer à l'une des nombreuses listes d'arguments possibles en fonction de la présence ou non d'arguments particuliers, du type :
./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
Et la meilleure façon à laquelle je puisse penser de faire cela proprement est d'avoir main()
traitez toutes les options communes et décidez laquelle de plusieurs fonctions appeler pour traiter le reste.
Notez que je ne souhaite pas restreindre l'ordre afin que les options communes ne puissent apparaître qu'en premier.
Mon problème est que si je réinitialise optind
à 1 avant d'analyser les arguments une seconde fois, getopt_long
segfaults en passant une chaîne invalide à strncmp
- donc je suppose que je ne devrais pas jouer avec optind.
J'ai utilisé Google et je ne trouve aucune référence indiquant s'il est possible de sauter partout dans le monde. getopt_long
liste d'arguments (je sais que c'est possible pour getopt
), si c'est le cas, comment faire ?
Je préférerais ne pas utiliser de bibliothèques non standard.(Le langage est du C simple, pas de C++ s'il vous plaît)
La solution
Mon problème était que je n'avais pas défini la dernière ligne de mon static struct option long_options[]
tableau à zéros, le réglage correct corrige l'erreur.
GNU getopt nécessite également optind
être remis à 0 et non à 1 afin de réinitialiser correctement son état interne.