说我有一个可执行文件(在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会很好。
有没有人知道可以做到这一点的多功能,轻量级和跨平台的库?
答案 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