À 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
Vous devez vous connecter pour publier un commentaire.
Votre getopt_long appel spécifie "svh" à court d'options quand il faut dire "s:vh". Le côlon dit getopt pour exiger un argument pour le "s".
OriginalL'auteur Kyle Jones
Je suis sûr que vous devez remplacer "svh" avec "s:vh". Par la Linux page de man pour getopt_long "optstring est une chaîne de caractères contenant l'option légitime caractères. Si un tel caractère est suivi par un deux-points, l'option nécessite un argument,".
OriginalL'auteur spdaley