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

时间:2009-01-14 01:14:42

标签: c++ windows

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

注意:仅限Windows专用

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

而不是,例如:

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

此致

7 个答案:

答案 0 :(得分:18)

如果您只想自己处理命令行选项,最简单方式是:

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 - 已修复。]

答案 1 :(得分:14)

使用C ++,答案通常在Boost ......

Boost.Program Options

答案 2 :(得分:5)

我建议使用图书馆。有经典和尊敬的getopt,我确信其他人。

答案 3 :(得分:5)

有许多好的图书馆可供选择。

Boost Program Options是一个相当重要的解决方案,因为将它添加到您的项目需要您构建提升,并且语法有点令人困惑(在我看来)。但是,它可以执行几乎所有操作,包括使命令行选项覆盖配置文件中设置的那些。

SimpleOpt是一个相当全面但简单的命令行处理器。它是一个单独的文件,具有简单的结构,但只处理将命令行解析为选项,您必须执行所有类型和范围检查。它适用于Windows和Unix,并且还附带了适用于Windows的glob版本。

getopt在Windows上可用。它与Unix机器上的相同,但通常是GPL库。

答案 4 :(得分:2)

这是我最喜欢的命令行管理方式,尤其是当效率问题时。这似乎有点矫枉过正,但我​​认为这种矫枉过正几乎没有什么缺点。

Use gperf for efficient C/C++ command line processing

缺点:

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

优点:

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

使用像eclipse这样的IDE你可以自动执行运行gperf的过程,所以你唯一需要做的就是在配置文件和switch语句中添加一个选项并按下build ...

我使用批处理文件来运行gperf并进行一些清理并使用sed添加包含警戒(在gperf生成的.hpp文件上)...

因此,您的软件中的代码非常简洁和干净,以及一个您不需要手动更改的自动生成的哈希表文件。我怀疑boost :: program_options是否真的会击败即使没有效率优先。

答案 5 :(得分:0)

如果您不想使用boost,我建议this小助手类。

答案 6 :(得分:0)

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

图书馆:http://sourceforge.net/projects/clp-parser

2010年10月26日 - 新版本2.0rc。修复了许多错误,修改了源代码,文档,示例和注释的完全重构。