从C ++的命令行处理参数的最有效的方法

有效地在C ++中进行命令行参数处理的build议:

注意 :仅Windows特定

1: #include <iostream.h> 2: int main(int argc, char **argv) 

而不是,例如:

  if ( argc != 3 ) { .... } 

问候

用C ++,答案通常是在Boost中…

Boost.Program选项

如果你只是想自己处理命令行选项, 最简单的方法是把:

 vector<string> args(argv + 1, argv + argc); 

main()的顶部。 这将所有命令行参数复制到std::string s的向量中。 然后你可以使用==比较字符串,而不是无休止的strcmp()调用。 例如:

 int main(int argc, char **argv) { vector<string> args(argv + 1, argv + argc); string infname, outfname; // Loop over command-line args // (Actually I usually use an ordinary integer loop variable and compare // args[i] instead of *i -- don't tell anyone! ;) for (vector<string>::iterator i = args.begin(); i != args.end(); ++i) { if (*i == "-h" || *i == "--help") { cout << "Syntax: foomatic -i <infile> -o <outfile>" << endl; return 0; } else if (*i == "-i") { infname = *++i; } else if (*i == "-o") { outfname = *++i; } } } 

[编辑:我意识到我正在复制argv[0] ,该程序的名称,成为args – 固定。]

我建议使用一个库。 有经典和古老的getopt ,我相信其他人。

有一些很好的图书馆可用。

提升程序选项是一个相当重量级的解决方案,因为把它添加到你的项目需要你建立提升,语法有点混乱(在我看来)。 但是,它几乎可以做任何事情,包括使命令行选项覆盖配置文件中设置的选项。

SimpleOpt是一个相当全面但简单的命令行处理器。 它是一个单一的文件,结构简单,但只处理命令行解析成选项,你必须做所有的类型和范围检查。 这对Windows和Unix都有好处,同时也为Windows提供了一个glob的版本。

在Windows上可以使用getopt。 它在Unix机器上是一样的,但它通常是一个GPL库。

这是我最喜欢的命令行方式,特别是,当然不仅仅是效率问题。 看起来似乎有点过分,但我认为这种矫枉过正的好处很少。

使用gperf进行高效的C / C ++命令行处理

缺点:

  • 你必须首先运行一个单独的工具来生成C / C ++中的哈希表的代码
  • 不支持特定的命令行界面。 例如,用一个短划线来声明多个选项的posix速记系统“-xyz”将很难实现。

优点:

  • 您的命令行选项与您的C ++代码分开存储(在单独的配置文件中,不需要在运行时读取,仅在编译时)。
  • 你所有的代码只有一个开关(打开枚举值)来确定你有哪个选项
  • 效率是O(n),其中n是命令行上的选项数量,可能的选项数量是无关紧要的。 最慢的部分可能是交换机的实现(有时编译器倾向于实现它们,就像其他块一样,降低其效率,尽管如果选择连续的值,这是不太可能的,请参阅: 本文关于交换机效率 )
  • 分配用于存储关键字的内存对于关键字集来说足够大,并且不大。
  • 也适用于C

使用像eclipse这样的IDE,你可能会自动运行gperf的过程,所以你唯一需要做的就是添加一个选项到配置文件和switch语句,然后按下build …

我用一个批处理文件来运行gperf并做一些清理,并添加包括警卫与sed(在gperf生成.hpp文件)…

因此,软件中的代码非常简洁,干净,并且您不需要手动更改自动生成的哈希表文件。 我怀疑boost :: program_options实际上是否会将效率作为一个优先事项来击败。

如果你不想使用提升,我会推荐这个小帮手类。

尝试CLPP库。 它是用于命令行参数解析的简单而灵活的库。 仅头和跨平台。 仅使用ISO C ++和Boost C ++库。 恕我直言,它比Boost.Program_options更容易。

库: http : //sourceforge.net/projects/clp-parser

2010年10月26日 – 新版本2.0rc。 修正了很多错误,对源代码,文档,示例和注释进行了全面的重构。