【问题标题】:Deal with many commnadline options in c++处理 C++ 中的许多命令行选项
【发布时间】:2014-06-28 18:53:34
【问题描述】:

我有一个 c++ 程序,它的 main 函数看起来像这样:

if(a.size == 2) {
    if(s1) {
        f1(a[0], a[1], "string1");
    }
    else{
        f1(a[0], a[1], "string2");
    }
}
if(a.size == 1) {
    if(s1) {
        f1(a[0], "string1");
    }
    else{
        f1(a[0], "string2");
    }
}
else {
    if(s1) {
        f1("string1");
    }
    else{
        f1("string2");
    }
}
...
...
...
...

as1 是从命令行选项接收的。 它有许多命令行选项和许多层if...else.. 结构,看起来更加混乱。 有什么改善的方法吗?

【问题讨论】:

  • 我推荐使用boost program options
  • 似乎您已经拥有解析所有命令行选项并将其结果存储在变量中的代码,例如as1。您是想重新设计/替换产生这些变量的代码,还是只是想要一种更简洁的方式来处理已经放置在这些变量中的数据?
  • 这些变量已经是 boost 解析器的结果,所以我正在寻找一种更好地处理这些变量的方法,而不是获取它们的方法。
  • 将这些变量初始化为默认值,然后在命令行选项中更改它们。

标签: c++ command-line command-line-arguments


【解决方案1】:

而不是这个原始代码,

if(a.size == 2) {
    if(s1) {
        f1(a[0], a[1], "string1");
    }
    else{
        f1(a[0], a[1], "string2");
    }
}
if(a.size == 1) {
    if(s1) {
        f1(a[0], "string1");
    }
    else{
        f1(a[0], "string2");
    }
}
else {
    if(s1) {
        f1("string1");
    }
    else{
        f1("string2");
    }
}

假设缺少else,做

auto const s = (s1? "string1" : "string2");
switch( a.size )
{
    case 0: f1( s ); break;
    case 1: f1( a[0], s ); break;
    case 2: f1( a[0], a[1], s ); break;
}

例如。


对于解析命令行参数的一般问题,请查看getopt 和各种选项解析器,例如在 Boost 中。

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 2013-04-30
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多