“条件”解析命令行参数

时间:2012-12-19 15:48:32

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

说我有一个可执行文件(在mac,win和linux上运行)

 a.out [-a] [-b] [-r -i <file> -o <file> -t <double> -n <int> ]

[ ]中的参数表示它是可选的。但是,如果设置了最后一个参数-r,则必须同时提供-i-o-t-n

有许多优秀的C ++ - 用于解析命令行参数的库,例如: gflags(http://code.google.com/p/gflags/),tclap(http://tclap.sourceforge.net/),simpleopt(http://code.jellycan.com/simpleopt/),boost.program_options(http://www.boost.org/doc/libs/1_52_0/doc/html/program_options.html)等。但我想知道是否有一个让我直接编码参数之间的这些条件关系,无需手动编码错误处理

if ( argR.isSet() && ( ! argI.isSet() || ! argO.isSet() || ... ) ) ...

并手动设置--help

tclap允许XOR参数,例如允许-a-b,但不允许同时使用。所以,在那个术语中,参数的AND会很好。

有没有人知道可以做到这一点的多功能,轻量级和跨平台的库?

4 个答案:

答案 0 :(得分:2)

你可以通过两个论点;如果选项中包含-r,则重置解析器并重新添加新的必需选项。


您还可以查看TCLAP XorHandler的工作原理,并创建自己的AndHandler

答案 1 :(得分:0)

您可以更改参数语法,以便-r连续获取四个值。

答案 2 :(得分:0)

我有TCLAP代码片段的一部分,似乎适合您正在寻找的错误处理部分,但它与您正在寻找的内容完全不匹配:

# include "tclap/CmdLine.h"

namespace TCLAP {

class RequiredDependentArgException : public ArgException {
public:
  /**
   * Constructor.
   * \param text - The text of the exception.
   * \param parentArg - The text identifying the parent argument source
   * \param dependentArg - The text identifying the required dependent argument
   * of the exception.
   */
  RequiredDependentArgException(
    const TCLAP::Arg& parentArg,
    const TCLAP::Arg& requiredArg)
  : ArgException(
    std::string( "Required argument ") +
    requiredArg.toString() +
    std::string(" missing when the ") +
    parentArg.toString() +
    std::string(" flag is specified."),
    requiredArg.toString())
  { }
};

} // namespace TCLAP

然后在调用TCLAP::CmdLine::parse后使用新的异常:

if (someArg.isSet() && !conditionallyRequiredArg.isSet()) {
  throw(TCLAP::RequiredDependentArgException(someArg, conditionallyRequiredArg));
}

我记得在扩展并添加一个可以处理这个逻辑的附加类,但后来我意识到我实际上唯一需要的是错误报告,因为逻辑并不完全简单且不容易浓缩(至少,不是对下一个可怜的人有用的方式)。一个人为的场景阻止我进一步追求它,“如果A为真,则必须设置B,但如果D值为N则不能设置C”。在本机C ++中表达这样的东西是要走的路,特别是当需要在CLI arg解析时进行非常严格的参数检查时。

对于真正的病态案例和要求,使用Boost.MSM(多状态机)之类的东西创建状态机。 HTH。

答案 3 :(得分:-1)

要解析命令行吗?可以使用simpleopt,它可以如下使用:从以下位置下载simpleopt: https://code.google.com/archive/p/simpleopt/downloads

测试: int _tmain(int argc,TCHAR * argv []) argv可以是:1.txt 2.txt * .cpp