C ++ 용 매개 변수 파서 라이브러리는 무엇입니까?
다음과 같은 방식으로 C ++ 프로그램에 매개 변수를 전달하고 싶습니다.
./myprog --setting=value
이 작업을 쉽게 수행하는 데 도움이되는 라이브러리가 있습니까?
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
정말 멋진 경량 디자인이며 사용하기 쉽습니다 : http://tclap.sourceforge.net/
ezOptionParser 를 사용하는 것이 더 쉽습니다 . 또한 단일 헤더 파일이며 STL 이외의 것에 의존하지 않으며 Windows 및 Linux (다른 플랫폼에서도 작동 할 가능성이 매우 높음)에서 작동하며 예제 덕분에 학습 곡선이 없으며 다른 라이브러리가 제공하지 않는 기능 (파일 가져 오기 / 내보내기 등)이 있습니다. 주석, 구분 기호가있는 임의의 옵션 이름, 자동 사용 형식 등)이 있으며 LGPL 라이센스가 있습니다.
그리고 사용할 수 있는 Google 라이브러리가 있습니다.
실제로 명령 줄 구문 분석은 "해결"되었습니다. 하나만 선택하세요.
GetOpt 를 포함하는 GNU C 라이브러리 에는 이러한 도구 가 있습니다 .
Qt를 사용하고 있고 GetOpt 인터페이스처럼, froglogic 은 여기에 멋진 인터페이스를 게시했습니다 .
가능하다면 나만의 경적을 울리며 내가 작성한 옵션 파싱 라이브러리 인 dropt를 살펴볼 것을 제안하고 싶습니다 .
- C 라이브러리입니다 (원하는 경우 C ++ 래퍼 포함).
- 가볍습니다.
- 확장 가능합니다 (사용자 정의 인수 유형은 쉽게 추가 할 수 있으며 기본 제공 인수 유형과 동일한 기초를 가질 수 있습니다).
- 의존성이없는 (C 표준 라이브러리 제외) 이식성이 매우 높아야합니다 (표준 C로 작성 됨).
- 매우 제한적인 라이선스 (zlib / libpng)가 있습니다.
다른 많은 사람들이 제공하지 않는 한 가지 기능은 이전 옵션을 재정의하는 기능입니다. 예를 들어, 쉘 별칭이있는 경우 :
alias bar="foo --flag1 --flag2 --flag3"
사용하고 bar
싶지만 --flag1
비활성화 된 상태에서 다음을 수행 할 수 있습니다.
bar --flag1=0
GNU GetOpt는 사용하기에 너무 즉각적이지 않다고 생각합니다.
Qt와 Boost가 해결책이 될 수 있지만 많은 코드를 다운로드하고 컴파일해야합니다.
그래서 std :: map <std :: string, std :: string> 매개 변수를 생성하는 파서를 직접 구현했습니다.
예를 들어 다음을 호출합니다.
./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; /* Prints 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;
}
argstream
다음과 매우 유사합니다 boost.program_option
. 변수를 옵션 등에 바인딩 할 수 있습니다. 그러나 구성 파일에 저장된 옵션은 처리하지 않습니다.
CLPP 라이브러리를 사용해보십시오. 명령 줄 매개 변수 구문 분석을위한 간단하고 유연한 라이브러리입니다. 헤더 전용 및 크로스 플랫폼. ISO C ++ 및 Boost C ++ 라이브러리 만 사용합니다. IMHO는 Boost.Program_options보다 쉽습니다.
라이브러리 : http://sourceforge.net/projects/clp-parser/
2010 년 10 월 26 일-새 릴리스 2.0rc. 많은 버그 수정, 소스 코드의 전체 리팩토링, 문서, 예제 및 주석이 수정되었습니다.
Qt 5.2 comes with a command line parser API.
Small example:
#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;
}
Example output
The automatically generated help screen:
$ ./qtopt -h Usage: ./qtopt [options] infile Tool for doing X. Options: -h, --help Displays this help. -v, --version Displays version information. -+ be verbose -o, --output Output file. Arguments: infile Input file.
Automatically generated version output:
$ ./qtopt -v ToolX 1.2
Some real calls:
$ ./qtopt b1 -+ -o tmp blah.foo Input files: ("b1", "blah.foo") , verbose: true , output: "tmp" $ ./qtopt Input files: () , verbose: false , output: "out"
A parse error:
$ ./qtopt --hlp Unknown option 'hlp'. $ echo $? 1
Conclusion
If your program already use the Qt (>= 5.2) libraries, its command line parsing API is convenient enough to get the job done.
Be aware that builtin Qt options are consumed by QApplication
before the option parser runs.
You could try my little options header (166 loc so easily hackable) options.hpp. It is a single header implementation and should do what you ask. It also prints you the help page automatically.
There are a couples of C++ argument parsers out there, you may want to try this one from http://clp.sourceforge.net/, very simple and convenient.
참고URL : https://stackoverflow.com/questions/253556/what-parameter-parser-libraries-are-there-for-c
'IT Share you' 카테고리의 다른 글
CocoaPods의 의견? (0) | 2020.11.10 |
---|---|
.NET에서 정수 목록 채우기 (0) | 2020.11.10 |
Mobile Safari의 고정 위치 (0) | 2020.11.10 |
R 플롯을 LaTeX로 가져 오나요? (0) | 2020.11.10 |
Java 생성 .jar 파일 (0) | 2020.11.10 |