C ++有哪些参数parsing器库?

我想以下列方式将parameter passing给我的C ++程序:

./myprog --setting=value 

有什么图书馆能帮我轻松做到吗?

另请参见C和Unix的参数parsing助手

Boost.Program_options

GNU GetOpt 。

一个简单的例子使用GetOpt:

 // C/C++ Libraries: #include <string> #include <iostream> #include <unistd.h> // Namespaces: using namespace std; int main(int argc, char** argv) { int opt; bool flagA = false; bool flagB = false; // Shut GetOpt error messages down (return '?'): opterr = 0; // Retrieve the options: while ( (opt = getopt(argc, argv, "ab")) != -1 ) { // for each option... switch ( opt ) { case 'a': flagA = true; break; case 'b': flagB = true; break; case '?': // unknown option... cerr << "Unknown option: '" << char(optopt) << "'!" << endl; break; } } // Debug: cout << "flagA = " << flagA << endl; cout << "flagB = " << flagB << endl; return 0; } 

如果您有选项接受参数,也可以使用optarg

TCLAP是一个非常好的轻量级devise和易于使用: http : TCLAP

我发现使用ezOptionParser更容易。 这也是一个单独的头文件,不依赖于任何东西,但STL,适用于Windows和Linux(很可能也是其他平台),没有学习曲线感谢的例子,具有其他库的function(如文件导入/导出带有注释,带分隔符的任意选项名称,自动使用格式等),并且是LGPL许可的。

还有一个谷歌图书馆可用。

真的,命令行parsing是“解决”的。 只要选一个。

GNU C库中有这些工具,其中包括GetOpt 。

如果你正在使用Qt和GetOpt接口, froglogic已经在这里发布了一个不错的界面。

我那个GNU GetOpt不是太直接用的。
QT和Boost可能是一个解决scheme,但是你需要下载和编译大量的代码。

所以我自己实现了一个parsing器,生成一个std :: map参数。
例如,打电话给:

  ./myProgram -v -p 1234 

地图将是:

  ["-v"][""] ["-p"]["1234"] 

用法是:

 int main(int argc, char *argv[]) { MainOptions mo(argc, argv); MainOptions::Option* opt = mo.getParamFromKey("-p"); const string type = opt ? (*opt).second : ""; cout << type << endl; /* print 1234 */ /* your check code */ } 

MainOptions.h

 #ifndef MAINOPTIONS_H_ #define MAINOPTIONS_H_ #include <map> #include <string> class MainOptions { public: typedef std::pair<std::string, std::string> Option; MainOptions(int argc, char *argv[]); virtual ~MainOptions(); std::string getAppName() const; bool hasKey(const std::string&) const; Option* getParamFromKey(const std::string&) const; void printOptions() const; private: typedef std::map<std::string, std::string> Options; void parse(); const char* const *begin() const; const char* const *end() const; const char* const *last() const; Options options_; int argc_; char** argv_; std::string appName_; }; 

MainOptions.cpp

 #include "MainOptions.h" #include <iostream> using namespace std; MainOptions::MainOptions(int argc, char* argv[]) : argc_(argc), argv_(argv) { appName_ = argv_[0]; this->parse(); } MainOptions::~MainOptions() { } std::string MainOptions::getAppName() const { return appName_; } void MainOptions::parse() { typedef pair<string, string> Option; Option* option = new pair<string, string>(); for (const char* const * i = this->begin() + 1; i != this->end(); i++) { const string p = *i; if (option->first == "" && p[0] == '-') { option->first = p; if (i == this->last()) { options_.insert(Option(option->first, option->second)); } continue; } else if (option->first != "" && p[0] == '-') { option->second = "null"; /* or leave empty? */ options_.insert(Option(option->first, option->second)); option->first = p; option->second = ""; if (i == this->last()) { options_.insert(Option(option->first, option->second)); } continue; } else if (option->first != "") { option->second = p; options_.insert(Option(option->first, option->second)); option->first = ""; option->second = ""; continue; } } } void MainOptions::printOptions() const { std::map<std::string, std::string>::const_iterator m = options_.begin(); int i = 0; if (options_.empty()) { cout << "No parameters\n"; } for (; m != options_.end(); m++, ++i) { cout << "Parameter [" << i << "] [" << (*m).first << " " << (*m).second << "]\n"; } } const char* const *MainOptions::begin() const { return argv_; } const char* const *MainOptions::end() const { return argv_ + argc_; } const char* const *MainOptions::last() const { return argv_ + argc_ - 1; } bool MainOptions::hasKey(const std::string& key) const { return options_.find(key) != options_.end(); } MainOptions::Option* MainOptions::getParamFromKey( const std::string& key) const { const Options::const_iterator i = options_.find(key); MainOptions::Option* o = 0; if (i != options_.end()) { o = new MainOptions::Option((*i).first, (*i).second); } return o; } 

如果可以的话,请自己动手,我也想build议看看我写的一个选项parsing库: dropt 。

  • 这是一个C库(如果需要,可以使用C ++包装器)。
  • 这是轻量级的。
  • 它是可扩展的(自定义参数types可以很容易地添加,并与内置的参数types具有相同的基础)。
  • 它应该是非常便携的(它是用C编写的),没有依赖关系(除了C标准库)。
  • 它有一个非常不受限制的许可(zlib / libpng)。

它提供了许多其他function的一个特点是能够覆盖早期的选项。 例如,如果你有一个shell别名:

 alias bar="foo --flag1 --flag2 --flag3" 

而你想用bar但是用--flag1禁用,它可以让你做到:

 bar --flag1=0 

argstreamargstream非常相似:它允许将variables绑定到选项等。但是它不处理存储在configuration文件中的选项。

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

库: http : //sourceforge.net/projects/clp-parser/

2010年10月26日 – 新版本2.0rc。 修正了很多错误,对源代码,文档,示例和注释进行了全面的重构。

Qt 5.2带有一个命令行parsing器API 。

小例子:

 #include <QCoreApplication> #include <QCommandLineParser> #include <QDebug> int main(int argc, char **argv) { QCoreApplication app(argc, argv); app.setApplicationName("ToolX"); app.setApplicationVersion("1.2"); QCommandLineParser parser; parser.setApplicationDescription("Tool for doing X."); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("infile", QCoreApplication::translate("main", "Input file.")); QCommandLineOption verbose_opt("+", QCoreApplication::translate("main", "be verbose")); parser.addOption(verbose_opt); QCommandLineOption out_opt(QStringList() << "o" << "output", QCoreApplication::translate("main", "Output file."), QCoreApplication::translate("main", "filename"), // value name QCoreApplication::translate("main", "out") // default value ); parser.addOption(out_opt); // exits on error parser.process(app); const QStringList args = parser.positionalArguments(); qDebug() << "Input files: " << args << ", verbose: " << parser.isSet(verbose_opt) << ", output: " << parser.value(out_opt) << '\n'; return 0; } 

输出示例

自动生成的帮助屏幕:

 $ ./qtopt -h
用法:./qtopt [options] infile
 X的工具。

选项:
   -h,--help显示此帮助。
   -v,--version显示版本信息。
   -  +详细
   -o,--output输出文件。

参数:
   infileinput文件。

自动生成的版本输出:

 $ ./qtopt -v
 ToolX 1.2

一些真正的电话:

 $ ./qtopt b1  -  + -o tmp blah.foo
input文件:(“b1”,“blah.foo”),详细:true,输出:“tmp”
 $ ./qtopt          
input文件:(),详细:假,输出:“出”

parsing错误:

 $ ./qtopt --hlp
未知选项“hlp”。
 $ echo $?
 1

结论

如果你的程序已经使用了Qt(> = 5.2)库,那么它的命令行parsingAPI就足够方便了。

请注意,在选项parsing器运行之前, QApplication将使用内置的Qt选项。

你可以尝试我的小选项头(166 loc如此容易hackable) options.hpp 。 这是一个单一的头部实现,应该做你所要求的。 它也会自动打印帮助页面。

在那里有一些C ++参数parsing器,你可能想从http://clp.sourceforge.net/试试这个,非常简单和方便。;