9

假设我有一个可执行文件(在 mac、win 和 linux 上运行)

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

其中参数 in[ ]表示它是可选的。但是,如果-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允许对参数进行异或运算,例如,一个-a或一个-b被允许,但不能两者兼而有之。所以,在那个术语中,参数的 AND 会很好。

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

4

4 回答 4

2

您可以两次通过论点;如果-r在选项中,则重置解析器并从添加的新强制选项重新开始。


您还可以研究 TCLAP 的XorHandler工作原理,并创建自己的AndHandler.

于 2012-12-19T15:53:39.610 回答
0

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

于 2012-12-19T15:54:55.800 回答
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。

于 2013-01-21T06:50:44.653 回答
-1

你想解析命令行吗?你可以使用simpleopt,它可以如下使用:下载simpleopt from: https ://code.google.com/archive/p/simpleopt/downloads

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

于 2019-07-09T08:24:04.490 回答