2016-04-23 5 views
2

Was es die richtige Anwendung, wenn ich dieses Verhalten will:Korrekte oder anständige getopts_long Verwendung?

$ ./a.out --help für Druckhilfeinformationen

$ ./a.out --version für das Drucken der Programmversion

ich dies so codieren, verwaltet, die es braucht, die Argumente, aber ich don Ich kenne keinen guten/richtigen Weg, um die Nachrichten zu trennen, da sie den gleichen Fall haben.

static struct option long_options[] = { 
     {"help", no_argument,  0, 0 }, 
     {"version", no_argument,  0, 0 }, 
     {0,   0,     0, 0 } 
}; 


int main(int argc, char *argv[]) { 


    while (1) { 
     int this_option_optind = optind ? optind : 1; 
     int option_index = 0; 


     c = getopt_long(argc, argv, "", 
         long_options, &option_index); 
     if (c == -1) 
      break; 

     switch (c) { 
      case 0: 
       printf("option %s", long_options[option_index].name); 
       if (optarg) 
        printf(" with arg %s", optarg); 
       printf("\n"); 
       return 0; 

      case '0': 
      case '1': 
      case '2': 
       if (digit_optind != 0 && digit_optind != this_option_optind) 
        printf("digits occur in two different argv-elements.\n"); 
       digit_optind = this_option_optind; 
       printf("option 2 2 %c\n", c); 
       return 0; 

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

      case 'b': 
       printf("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 '?': 
       break; 

      default: 
       printf("?? getopt returned character code 0%o ??\n", c); 
     } 
    } 

    if (optind < argc) { 
     printf("non-option ARGV-elements: "); 
     while (optind < argc) 
      printf("%s ", argv[optind++]); 
     printf("\n"); 
    } 

... 

Antwort

2

Hier: ein Synonym zu "-Version", würde dies so gemacht wird

while (1) 
{ 
    int option_index = 0; 
    static struct option long_options[] = { 
     {"with_param", required_argument, 0, 'p'}, 
     {"version", no_argument, 0, 'v'}, 
     {"help", no_argument, 0, 'h'}, 
     {0, 0, 0, 0} 
    }; 

    option = getopt_long(argc, argv, "p:vh", 
         long_options, &option_index); 
    if (option == -1) 
     break; 

    switch (option) { 
    case 'p': 
    { 
     store_parameter(optarg); 
     break; 
    } 
    case 'v': 
    { 
     print_version(); 
     break; 
    } 
    case 'h': 
    { 
     print_help(); 
     exit(EXIT_SUCCESS); 
     break; 
    } 
    default: 
    { 
     fprintf(stderr, "Error (%s): unrecognized option.\n", __FUNCTION__); 
     print_help(); 
     exit(EXIT_FAILURE); 
     break; 
    } 
    } /* end switch */ 
} 

Beachten Sie die Zeichenfolge "p:vh" als Parameter von getopt_long, mit der Sie auch kurze Optionen verwenden können. (":" folgt Optionen mit einem erforderlichen Argument)

2

Sie müssen getopt_long die Werte sagen, es zurückgeben muss:

static struct option long_options[] = { 
    {"help", no_argument,  NULL, 1 }, 
    {"version", no_argument, NULL, 2 }, 
    {0,   0,     0, 0 } 
}; 

Auch könnten Sie „h“ als Synonym zu „--help“ und „V“ verwenden, wie haben Sie ein Beispiel

static struct option long_options[] = { 
    {"help", no_argument,  NULL, 'h' }, 
    {"version", no_argument, NULL, 'V' }, 
    {0,   0,     0, 0 } 
}; 

    /* ... */ 

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

    /* ... */ 

    case 'h': // instead of case 1: 

    /* ... */ 

    case 'V': // instead of case 2: 

    /* ...*/