2010-05-26 11 views
13

Ich habe den Grund 'Stil' der meisten GNU Core-Anwendungen bemerken wobei Argumente sind:Bibliothek zum Parsen von Argumenten GNU-Stil?

  • --longoption
  • --longoption=value oder --longoption value
  • -abcdefg (mehrere Optionen)
  • -iuwww-data (Option i, u = www-data)

Sie folgen dem über Stil. Ich möchte vermeiden, einen Argument-Parser zu schreiben, wenn es eine Bibliothek gibt, die dies mit dem obigen Stil tut. Gibt es einen, den du kennst?

Antwort

14

getopt_long wird die Arbeit tun, hier ist ein Beispiel von http://www.gnu.org/s/libc/manual/html_node/Getopt-Long-Option-Example.html

#include <stdio.h> 
#include <stdlib.h> 
#include <getopt.h> 

/* Flag set by ‘--verbose’. */ 
static int verbose_flag; 

int 
main (argc, argv) 
     int argc; 
     char **argv; 
{ 
    int c; 

    while (1) 
    { 
     static struct option long_options[] = 
     { 
      /* These options set a flag. */ 
      {"verbose", no_argument,  &verbose_flag, 1}, 
      {"brief", no_argument,  &verbose_flag, 0}, 
      /* These options don't set a flag. 
       We distinguish them by their indices. */ 
      {"add",  no_argument,  0, 'a'}, 
      {"append", no_argument,  0, 'b'}, 
      {"delete", required_argument, 0, 'd'}, 
      {"create", required_argument, 0, 'c'}, 
      {"file", required_argument, 0, 'f'}, 
      {0, 0, 0, 0} 
     }; 
     /* getopt_long stores the option index here. */ 
     int option_index = 0; 

     c = getopt_long (argc, argv, "abc:d:f:", 
         long_options, &option_index); 

     /* Detect the end of the options. */ 
     if (c == -1) 
     break; 

     switch (c) 
     { 
     case 0: 
      /* If this option set a flag, do nothing else now. */ 
      if (long_options[option_index].flag != 0) 
      break; 
      printf ("option %s", long_options[option_index].name); 
      if (optarg) 
      printf (" with arg %s", optarg); 
      printf ("\n"); 
      break; 

     case 'a': 
      puts ("option -a\n"); 
      break; 

     case 'b': 
      puts ("option -b\n"); 
      break; 

     case 'c': 
      printf ("option -c with value `%s'\n", optarg); 
      break; 

     case 'd': 
      printf ("option -d with value `%s'\n", optarg); 
      break; 

     case 'f': 
      printf ("option -f with value `%s'\n", optarg); 
      break; 

     case '?': 
      /* getopt_long already printed an error message. */ 
      break; 

     default: 
      abort(); 
     } 
    } 

    /* Instead of reporting ‘--verbose’ 
     and ‘--brief’ as they are encountered, 
     we report the final status resulting from them. */ 
    if (verbose_flag) 
    puts ("verbose flag is set"); 

    /* Print any remaining command line arguments (not options). */ 
    if (optind < argc) 
    { 
     printf ("non-option ARGV-elements: "); 
     while (optind < argc) 
     printf ("%s ", argv[optind++]); 
     putchar ('\n'); 
    } 

    exit (0); 
} 
+0

Aber wenn Sie nicht libc haben ... –

4

GNU bietet getopt_long, obwohl sie eigentlich argp empfehlen. Schauen Sie sich das GNU libc Handbuch entry on parsing arguments an.

+0

Aber das ist Teil libc und keine eigenständige Bibliothek. –

+0

@Dirk Eddelbuettel Die Frage erwähnt explizit GNU-Stil, also bin ich mir nicht sicher, dass das ein Problem ist. –

+0

Hank: OP fragte nach Bibliothek im Titel, es ist nicht klar, ob er auf libc zugreifen kann und will. Wenn er unter Linux ist, geht es ihm gut. Wenn er eine portable Standalone-Bibliothek haben möchte, hilft Ihre Antwort nicht. Aber nur die OP kann sagen :) –

2

Zurück in den Tag Menschen verpackt nur getopt.c und getopt.h mit ihren Quellen.

Hier ist ein Google Code query dafür. Sie könnten das verwenden, wenn Sie nicht von GNU libc abhängig sein möchten, weil Sie dies möglicherweise auf einem anderen Betriebssystem benötigen. Aber wenn du Linux verwendest, dann gibt es die libc bereits, wie es die anderen Antworten vorschlagen.

+0

Der Link zu Google Code Abfrage ist tot. – gbmhunter

+0

Google Code wurde vor ein oder zwei Jahren von Google entfernt. –

1

Google hat offen die google-gflags Bibliothek stammen, eine Befehlszeile-Flag-Parsing-Bibliothek ..

AFAIK, ist es nicht eine „lange und kurze“ bieten Version jedes Flag (so können Sie nicht in mehreren kombinieren Optionen "-aeiou"), aber es ist trivial zu verwenden und erfordert keine zentralisierte Liste von Flags.

Verwandte Themen