Est-il possible de revenir en arrière dans une liste d'arguments getopt_long ?

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

  •  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)

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top