C/Unix的参数分析帮助程序

C/Unix的参数分析帮助程序,c,command-line,parsing,C,Command Line,Parsing,我知道: 尊者getopt(3) 扩展的getopt\u long glibc的Unix风格参数向量解析器 来自GNOME项目(或其精神继承者) 我确信还有更多我没有用过的,甚至没有听说过的;快速谷歌搜索显示,和 就我个人而言,我最喜欢argp,我用getopt/getopt\u long(超出一定的复杂性基线)编写的每个程序都已转换为使用argp。它比popt更广泛,比getopt_long更强大,文档丰富,与所有GNU风格的约定一致,并且非常灵活。缺点是,它远不是最容易使用的(多亏了它的

我知道:

  • 尊者
    getopt(3)
  • 扩展的
    getopt\u long
  • glibc的Unix风格参数向量解析器
  • 来自GNOME项目(或其精神继承者)
我确信还有更多我没有用过的,甚至没有听说过的;快速谷歌搜索显示,和

就我个人而言,我最喜欢
argp
,我用
getopt
/
getopt\u long
(超出一定的复杂性基线)编写的每个程序都已转换为使用
argp
。它比
popt
更广泛,比
getopt_long
更强大,文档丰富,与所有GNU风格的约定一致,并且非常灵活。缺点是,它远不是最容易使用的(多亏了它的灵活性),而且支持它的代码非常冗长(C中的许多东西也是如此)

你用什么,为什么

是的,我是指C而不是C++。有很多C++解析器,但我不使用C++。 约翰·米利金指出,
popt
不再被维护。我之所以列出它,是因为许多程序仍然在使用它——包括AbiWord、rpm、rsync和samba——尽管Gnome努力做到这一点。但我现在也添加了到Glib的参数解析器的链接



参数解析,参见问题

<代码> POPT < /C> >已经被抛弃很久了——自从2.6版本,三年前,参数解析合并到GLUB >

我使用glib的解析器,或者Python的getopt端口,我非常喜欢这个库,因为它非常灵活并且易于使用。它也是完全基于模板的,所以它是一个只包含标题的库

我的错误:你说C和我张贴了一个C++库…

GNU,它为一个选项数据结构和<代码> GETOPTTYLUG/<代码>生成代码,解析命令行并填充结构。它相当容易学,而且效果很好

作为奖励,您可以在代码周围传递选项结构,并根据需要避免全局存储

它提供了GNU风格的语义(很明显),如果您不确定用户的构建环境,它很小,可以简单地包含在项目中进行分发。

俗话说,“标准比更好”。所以我总是使用getopt_long()和任何非GNOME/glibby的东西,以及任何有GNOME/glibby的东西上的glib


出于同样的原因,我总是在Python应用程序中使用optparse,尽管它有许多与getopt_long()相关的功能缺失。。。但这是Python标准。

因为我也在寻找同样的东西,所以我阅读了这个老话题的答案。最后我选择了中提到的。实际上它是用C实现的,所以我认为这里也值得一提。我还没有使用C++助手,它封装了C实现。 关于Drop的有趣事实:

  • 轻量级
  • 仅依赖于标准LIB
  • 没有陡峭的学习曲线
  • 足以进行基本的arg解析,再加上几个强大的功能
  • 易于扩展
  • 非限制性许可证(zlib-ish)
但它是有限的。例如,我必须稍微调整我的参数语法规范;在这种情况下,这是可以接受的,但当然,有时规格是刻在石头上的


作为结论,我建议Drop至少用于快速原型、工具开发和内部项目。

我也不太喜欢getopt(尽管它相当标准)。我提出的一个解决方案是函数argopt()。它与C兼容,可用于测试是否设置了标志以及读取带有值的选项。虽然为长选项(例如--help)编写类似的函数应该不会太困难,但它只支持短选项(例如-h)。见示例:

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

    if(argopt(argc, argv, 'p')) printf("-p is set\n");
    if(argopt(argc, argv, 'q')) printf("-q is set\n");

    const char *f = argopt(argc, argv, 'f');
    if(f) printf("-f is %s\n",f);

    return 0;
}
命令行中的示例:

$./main -f input.txt -rq
-q is set
-f is input.txt
免责声明:我做这个函数是为了好玩,希望它简短、兼容C语言、易于使用,并且没有依赖性。这是:

const char* argopt(int argc, const char *const *argv, char key){

    for(int i=1; i<argc; i++){
        const char *c = argv[i];
        if(*c!='-') continue;
        while(*++c) if(*c==key) return argv[(i+1)%argc];
    }

    return 0;
}
const char*argopt(int argc,const char*const*argv,char key){

对于(int i=1;i我一直在开发和使用这是一个用纯C编写的命令行参数解析库。它提供:

  • 跨平台功能(Linux、OS X、Windows)
  • 可配置的解析器,其中每个参数的行为都不同(功能强大且灵活)
  • 输入错误、未知参数或无效参数的自动生成消息
  • 设计命令行用户界面的额外功能
  • 良好的文档

我想知道为什么要使用glib的参数解析器——是什么让它比其他解析器更适合您的使用?除了与glib捆绑在一起之外没有其他原因。我可以学习如何使用另一个解析器,或者只使用其他人都使用的解析器。只需说明这个问题会问“您使用了什么,为什么?”…Glib的解析器看起来确实很不错,不过,谢谢你的回答。2009年4月发布了
popt
的1.15版,2010年5月发布了1.16版。但是,如果相信该网站的话,从那以后就没有发布过任何版本了-现在(2018年3月)符合“未维护”的条件,即使这在2010年年中不是严格意义上的。我从未使用过没有glibc的系统,但您确实有一个很好的观点,即getopt_long更为广泛。现在我很好奇为什么您和John都提到Python?:)我不能为他们说话,但一般来说,我认为WITTEN直接C程序的时间腰。我在Python中编写程序,如果在C中有必要的库。在Python 3。x中,标准已经更名为AgPARSE。完全好。非常感谢,有人在实际使用我的库!e> ./main-t-V
,您永远不会报告无效的选项-您只会忽略它们(示例中的证人
-r