11

명령 줄 옵션, 설정 및 구성 파일을 처리하는 데 사용하는 패키지는 무엇입니까?명령 줄 옵션과 구성 파일을 어떻게 처리합니까?

나는 명령 행 및/또는 설정 파일에서 사용자 정의 옵션 사용자 정의 옵션을 찾고 있습니다.

옵션 (설정)을 다른 그룹으로 나누어서 코드의 다른 개체에 다른 (하위 집합) 옵션을 전달할 수 있도록해야합니다.

저는 boost::program_options을 알고 있지만, API에 익숙하지 않습니다. 경량 대안이 있습니까?

(BTW, 당신이 이제까지 글로벌 옵션은 어디에서 읽을 수있는 코드에서 객체? 아니면 악을 고려할 사용합니까?)

답변

5

글쎄, 당신 내 대답을 좋아하지 않을거야. 나는 boost::program_options을 사용한다. 인터페이스는 익숙해 져야하지만 일단 사용 중지되면 놀라운 것입니다. 구문 오류가 발생하면 에 런타임 오류가 발생하기 때문에 단위 테스트의 보트로드를 수행하십시오.

그리고, 나는 그것을 싱글 톤 객체 (읽기 전용)에 저장합니다. 나는 그것이 그럴 경우 사악하다고 생각하지 않는다. 그것은 싱글 톤이 받아 들여질 수있는 몇 가지 경우 중 하나입니다.

+1

+1 부스트 : : program_options,하지만 단지! 나는 프로그램 옵션을 싱글 톤으로 사용할 때 조심할 것이다. 우리는 이제 다른 파일에 대해 다른 옵션 세트를 추가해야한다는 점에서이 작업을 수행하여 물었다. 먼저 개별 파일에 대해 다양한 옵션 집합을 저장할 수 있도록 싱글 톤을 제거하고 제거해야합니다. –

+0

좋은 지적입니다, Richard. 나는 게임을 위해 boost :: program_options를 사용하고 분명히 1 옵션 세트만으로 프로세스 당 충분하지만, 다른 목적으로는 나쁜 생각 일 것이다. – rlbond

+0

아직도 boost :: program_options에 찬성하십니까? 더 이상 개발되지 않은 것으로 보입니다 (문서 웹 사이트는 2004 년 마지막으로 수정되었습니다). 그것은 사용합니까/C++ 11과 호환됩니까? 귀하의 게시물 라인 사이에서 읽는다면, 실제로는 전혀 추천하지 않습니다. * 단위 테스트의 보트로드를 수행하십시오. 구문 오류가 발생하면 런타임 오류가 발생합니다 * 큰 붉은 깃발! – Walter

-4

Apache Ant을보십시오. 그것의 주요 사용법은 Java 프로젝트이지만, Java에 관한 것은 없으며 거의 ​​모든 것에 사용할 수 있습니다.

사용법은 매우 간단하며 커뮤니티 지원도 많이 있습니다. 당신이 묻는대로 일을하는 것이 정말 좋습니다.

코드에서 전역 옵션은 매우 필수적이고 유용하다고 생각합니다. 그들을 오용하지 마십시오.

+3

어, Apache Ant? 빌드 도구? C++에서 명령 행 옵션을 읽는 것과 무슨 상관이 있습니까? – Frank

+0

C++에 대한 기본 설정 파일을 유지할 수 있지만 모든 실제 작업은 Ant로 수행 할 수 있습니다. http://www.codemesh.com/products/junction/doc/ant_cpp.html 또는 http://www.google.com/search?hl=ko&site=&q=using+ant+c%2B%2B&btnG= 검색 –

0

명령 줄 인수 구문 분석에 대해 확실하지 않습니다. 나는 그 분야에서 매우 풍부한 기능을 필요로하지 않았으며 일반적으로 소프트웨어에 더 많은 의존성을 추가하는 것을 막기 위해 내 자신을 굴렸다. 귀하의 필요에 따라이 경로를 시도하거나 원치 않을 수도 있습니다. 필자가 작성한 C++ 프로그램은 일반적으로 명령 행에서 호출되지 않습니다.

한편 config 파일의 경우 XML 기반 형식을 능가 할 수 없습니다. 그것은 읽기 쉽고, 확장 가능하며, 구조화 된 것입니다. :) 거기에는 많은 XML 파서가 있습니다. 사실 C 라이브러리이기는하지만 xmlsoft.org에서 libxml2를 사용하는 경향이 있습니다.

+0

C++로 작성된 빠른 XML 파서는 [pugixml.org] (http://pugixml.org)에서 확인하십시오. 보너스로'XPath'를 지원하며 헤더 만 지원합니다! – Sean

3

부스트가 너에게 과잉이라면, GNU Gengetopt도 아마도 그렇지만 IMHO 일 가능성이있다.

그리고 전역 옵션 개체를 사용하지 않으려 고합니다. 각 클래스마다 자체 구성을 읽는 것을 선호합니다. "Globals are evil"철학 외에도, 모든 구성을 한 곳에서 처리하기 위해 끊임없이 성장하는 혼란을 겪는 경향이 있으며 어디에서 어떤 구성 변수가 사용되는지 알기가 더 어려워집니다. 구성을 사용중인 위치에 가깝게 유지하면 각 구성 요소가 무엇인지를 분명히 알 수 있으며 더 쉽게 유지할 수 있습니다.

(내가 사용하는 것에, 개인적으로, 최근 모든 것이 내 회사에서 다른 사람이 쓴 독점 명령 줄 구문 분석 라이브러리있었습니다,하지만 불행하게도 많은 도움이되지 않기 때문에)

1

GNU getopt는 꽤 좋습니다. C++ 환경을 원한다면 기본 getopt를 감싸는 래퍼 인 getoptpp을 고려하십시오. 구성 파일에 관한 한 파싱이 쉽도록 가능한 한 바보처럼 만들어야합니다. 조금 사려 깊다면 yaac & lex를 사용하는 것이 좋겠지 만 작은 앱의 경우 큰 돈이 될 것입니다.

또한 응용 프로그램에서 구성 파일과 명령 줄 옵션을 모두 지원해야한다고 제안합니다. 구성 파일은 자주 변경되지 않는 옵션에 적합합니다. 명령 줄 옵션은 즉각적인 변경 인수를 전달할 때 유용합니다 (일반적으로 다른 프로그램에서 호출되는 앱을 만들 때 유용합니다).

11

Google에서는 gflags을 사용합니다. 설정 파일을 만들지는 않지만 플래그의 경우 getopt를 사용하는 것보다 고통스럽지 않습니다.

#include <gflags/gflags.h> 
DEFINE_string(server, "foo", "What server to connect to"); 
int main(int argc, char* argv[]) { 
    google::ParseCommandLineFlags(&argc, &argv, true); 
    if (!server.empty()) { 
     Connect(server); 
    } 
} 

플래그의 값을 알아야하는 파일의 맨 위에 DEFINE_foo을 넣습니다. 다른 파일에서도 값을 알아야 할 경우 DECLARE_foo을 사용합니다. 테스트에 대한 지원도 매우 좋으므로 단위 테스트는 서로 다른 플래그를 독립적으로 설정할 수 있습니다.

+0

내가 좋아하는! 매우 사용하기 쉽습니다. – Milan

1

x86 및 x64 Windows에서 Visual Studio 2005를 사용하는 경우 SimpleLibPlus library에 좋은 명령 행 구문 분석 유틸리티가 있습니다. 나는 그것을 사용했고 그것을 매우 유용하다고 생각했다.

6

커맨드 라인과 C++에서 필자는 TCLAP : Templatedized Command Line Arguments Parser를 좋아했습니다. 내가 지금 ~ 2 년 TCLAP를 사용하지만 봤는데

http://sourceforge.net/projects/tclap/

3

무작위로 나는 ezOptionParser를 우연히 발견했다. ezOptionParser는 다른 옵션 파서와 같은 방식으로 "이 복잡한 일 필요는 없습니다"라는 오류를 겪지 않습니다.

나는 지금까지 꽤 인상적이었고 앞으로는 config 파일을 지원하기 때문에 앞으로도 계속 사용할 것입니다. TCLAP은보다 정교한 라이브러리이지만 ezOptionParser의 단순함과 추가 기능은 매우 매력적입니다. 웹 사이트에서

다른 특전 (0.2.0 기준)을 포함한다 : 디버깅을위한 구문 분석 입력

  • 예쁜 인쇄.
  • 세 가지 레이아웃 (정렬, 인터리브 또는 시차)으로 자동 사용 메시지 작성.
  • 단일 헤더 파일 구현.
  • STL에만 종속됩니다.
  • 임의의 짧고 긴 옵션 이름 (대시 '-'또는 더하기 '+'접두사는 필요하지 않음).
  • 임의의 인수 목록 구분 기호.
  • 여러 플래그 인스턴스가 허용됩니다.
  • 필수 옵션, 플래그 당 예상 인수 수, 데이터 유형 범위, 사용자 정의 범위, 목록의 구성원 및 문자열 목록의 대/소문의 유효성 검사.
  • 문자열 또는 상수로 정의 할 수있는 유효성 검사 기준입니다.
  • 주석이있는 여러 파일 가져 오기.
  • 파일로 내보내거나 옵션을 설정하거나 사용 가능한 경우 기본값을 포함한 모든 옵션을 설정합니다.
  • 옵션 종속적 컨텍스트에 대한 옵션 구문 분석 인덱스.
+0

나는 이것이 매우 오래된 쓰레드라는 것을 알고 있지만,이 쓰레드를 읽은 후에 다른 사람들이 내가했던 것과 같은 함정에 빠지는 것을 피하기 위해서이다. ezOptionParser는 실제로 옵션을 파싱하는 데는 잘 작동하지만 getUsage() 함수를 사용하여 명령 행 옵션을보고하면 치명적인 버그가 발생하여 응용 프로그램이 손상됩니다. 현재이 라이브러리는 작성자가 지원하지 않으므로이 버그가 수정되지 않습니다. 극도의주의하에 사용하십시오. 또는 다른 것을 사용하십시오. – Graham