2010-09-30 7 views
4

Existe-t-il un moyen vraiment efficace de traiter les paramètres de la ligne de commande en C++? Ce que je fais ci-dessous me semble complètement amateur, et je ne peux pas m'imaginer comment les paramètres de la ligne de commande sont vraiment gérés (atoi, contrôles argc codés en dur) dans les logiciels professionnels.Quel est un moyen efficace d'analyser les paramètres de la ligne de commande en C++?

 
// Command line usage: sum num1 num2 

int main(int argc, char *argv[]) 
{ 
   if (argc < 3) 
   { 
      cout << "Usage: " << argv[0] << " num1 num2\n"; 
      exit(1); 
   }
   int a = atoi(argv[1]);    int b = atoi(argv[2]);    int sum = a + b;
   cout << "Sum: " << sum << "\n";
   return 0; }
+0

Je pense que le code source Nunit (C#) a un bon exemple d'une classe de traitement de ligne de commande .... –

+1

double possible de [Option Parsers pour c/C++?] (Http://stackoverflow.com/questions/637371/option-parsers-for-cc) – wilhelmtell

+0

Pour l'exemple ci-dessus, il est parfait. Je ne ferais rien de plus complexe. Maintenant, si vous faites quelque chose comme gcc où il y a quelques milliers de drapeaux, alors une bibliothèque peut être utile, mais quand l'une est requise par rapport à l'autre dépend entièrement de la situation. –

Répondre

16

Vous souhaitez probablement utiliser une bibliothèque externe pour cela. Il y a beaucoup de à choisir. Boost a une bibliothèque très riche (comme d'habitude) Boost Program Options.

Mon favori personnel pour les dernières années a été TCLAP - purement modélisé, donc pas de bibliothèque ou de liaison, génération automatisée - 'help' et autres goodies. Voir le simplest example à partir des docs.

+0

+1, ne connaissait pas tclap et il parvient à être léger et pourtant se sent complet, je vais certainement approfondir. –

2

si cela est linux/unix alors le standard à utiliser est gnu getopt

http://www.gnu.org/s/libc/manual/html_node/Getopt.html

+0

Pas vraiment car la question était au sujet de C++ et Getopt est simplement C. Il y avait une variante C++ de celui-ci mais pour une raison quelconque, il a été retiré. –

+1

cela fonctionne très bien en C++ tho; C'est ce que nous utilisons dans tout notre code C++. – pm100

+0

Eh bien oui mais vous pouvez faire * beaucoup * mieux avec, par exemple, TCLAP. J'ajoute ou enlève une ligne avec la nouvelle définition d'option et je n'ai pas besoin d'éditer le code à l'autre endroit -> pas si vrai avec old school getopt. –

0

J'utilise getopt() sous Windows/MinGW:

while ((c = getopt(myargc, myargv, "vp:d:rcx")) != -1) { 
     switch (c) { 
     case 'v': // print version 
      printf("%s Version %s\n", myargv[0], VERSION); 
      exit(0); 
      break; 
     case 'p': // change local port to listen to 
      strncpy(g_portnum, optarg, 10); 
      break; 
... 
Questions connexes