【问题标题】:Library for parsing arguments GNU-style? [closed]用于解析 GNU 风格参数的库? [关闭]
【发布时间】:2010-05-26 14:18:18
【问题描述】:

我注意到大多数 GNU 核心应用程序的基本“风格”,其中的参数是:

  • --longoption
  • --longoption=value--longoption value
  • -abcdefg(多选)
  • -iuwww-data(选项iu = www-data

他们遵循上述风格。如果有一个使用上述样式的库,我想避免编写参数解析器。有你认识的吗?

【问题讨论】:

    标签: c linux arguments gnu


    【解决方案1】:

    getopt_long 将完成这项工作,这是来自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);
     }
    

    【讨论】:

    • 但是如果你没有 libc ...
    【解决方案2】:

    GNU 提供getopt_long,尽管他们实际上推荐argp。查看 GNU libc 手册entry on parsing arguments

    【讨论】:

    • 但这只是 libc 的一部分,而不是独立的库。
    • @Dirk Eddelbuettel 这个问题明确提到了 GNU 风格,所以我不确定这是个问题。
    • Hank:OP 在标题中要求库,不清楚他是否可以并且想要访问 libc。如果在Linux上,他很好。如果他想要一个可移植的独立库,那么您的回答将无济于事。但只有 OP 可以告诉 :)
    • @Dirk Eddelbuettel 某处有一个独立的 GNU getopt 实现......我认为有一个作为 GNUWin32 的一部分,以及其他项目
    • 是的,我以前也用过,尤其是。对于长式论证。但它似乎已经消失了。这些天来,我喜欢使用tclap,这是一个很好的模板化标头 C++ 解决方案,可以自动生成帮助、测试……但它对想要 C 库的 OP 没有帮助。
    【解决方案3】:

    【讨论】:

    • 请不要只发布链接,因为它们将来可能会失效。
    【解决方案4】:

    过去人们只是将getopt.cgetopt.h 与他们的来源打包在一起。

    这是一个Google Code query。如果您不想依赖 GNU libc,则可以使用它,因为您可能在不同的操作系统上需要它。但是,如果您使用的是 Linux,那么 libc 已经按照其他答案的建议将其提供给您。

    【讨论】:

    • Google 代码查询的链接已失效。
    • Google 代码在一两年前被 Google 删除。
    【解决方案5】:

    Google 开源了google-gflags 库,一个命令行标志解析库..

    AFAIK,它不提供每个标志的“长和短”版本(因此您不能在多个选项中组合“-aeiou”),但它使用起来很简单,不需要集中列表标志。

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2021-12-16
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多