À l'aide de getopt_long (C++) comment puis-je code en haut d'une longue & option courte à la fois besoin d'arguments?

#include <iostream>
#include <getopt.h>

#define no_argument 0
#define required_argument 1 
#define optional_argument 2


int main(int argc, char * argv[])
{
  std::cout << "Hello" << std::endl;

  const struct option longopts[] =
  {
    {"version",   no_argument,        0, 'v'},
    {"help",      no_argument,        0, 'h'},
    {"stuff",     required_argument,  0, 's'},
    {0,0,0,0},
  };

  int index;
  int iarg=0;

  //turn off getopt error message
  opterr=1; 

  while(iarg != -1)
  {
    iarg = getopt_long(argc, argv, "svh", longopts, &index);

    switch (iarg)
    {
      case 'h':
        std::cout << "You hit help" << std::endl;
        break;

      case 'v':
        std::cout << "You hit version" << std::endl;
        break;

      case 's':
        std::cout << "You hit stuff" << std::endl;
        break;
    }
  }

  std::cout << "GoodBye!" << std::endl;

  return 0; 
}

De sortie:

./a.out -s
Hello
You hit stuff
GoodBye!

De sortie:

./a.out --stuff
Hello
./a.out: option `--stuff' requires an argument
GoodBye!

Conflit besoin résolu: les Deux -s & --s devrait dire: ./un.: l'option `--trucs " nécessite un argument utilisé sans procédure d'arguments à la suite de la commande. Mais seulement --trucs? Personne ne sait ce que je suis en manque ici?

Résultat souhaité:

./a.out -s
     Hello
     ./a.out: option `--stuff' requires an argument
      GoodBye!

./a.out --stuff
     Hello
     ./a.out: option `--stuff' requires an argument
     GoodBye!
Juste un nit: il n'y a pas besoin de ces #define états, comme les variables de même nom aurait été déclarée comme un enum quand getopt.h est inclus, ainsi, la redéfinition pourrait jeter une erreur. Si certains ésotérique, archaïque, ou autrement cassé de la plate-forme getopt.h ne pas déclarer ces variables, puis le #définit devrait probablement être enveloppé à l'intérieur d'un #ifdef la vérification de certaines variables définies que sur cette plate-forme spécifique.

OriginalL'auteur stackoverflow | 2012-01-09