2017-09-03 10 views
0

the official tutorial의 예제를 기반으로 문제를 재현했습니다.부스트 프로그램 옵션 - 함수 결과에서 arg 이름 전달

#include <string> 
#include <boost/program_options.hpp> 
#include <iostream> 

namespace po = boost::program_options; 
using namespace std; 

const char* withAlias(const char* name, const char* alias) 
{ 
    return (string(name) + "," + alias).c_str(); 
} 

int main(int argc, char** argv) 
{ 
    po::options_description desc; 
    const auto name = withAlias("compression", "c"); 
    desc.add_options() 
     (name, po::value<int>(), "compression bla bla"); // this doesn't work 
     ("compression,c", po::value<int>(), "asdasdasd"); // this works 

    po::variables_map vm; 
    po::store(po::parse_command_line(argc, argv, desc), vm); 
    po::notify(vm); 

    if (vm.count("compression")) 
     cout << "Compression set to " << vm["compression"].as<int>() << endl; 
    else 
     cout << "Compression not set" << endl; 
    return 0; 
} 

내 프로그램을 실행 : unrecognized option '--compression'을 : my_bin --compression 5, 그것은라는 오류가 발생합니다.

별칭 (별칭 ("compression", ...))을 사용하지 않을 때 예상대로 작동합니다.

이름 문자열에 ,이 있지만 문자열 리터럴로 전달되지 않은 경우에만 발생합니다.

실제로이 문제의 원인을 파악할 수 없습니다.

+0

는'당신이 시도 했나 "-c, - 압축"'? (지금은 링크를 읽으면 작동하지 않을 것입니다) –

+0

@ YuvalBen-Arie가 작동했는데 작동하지 않았습니다. 동일한 오류 –

답변

2
const char* withAlias(const char* name, const char* alias) 
{ 
    return (string(name) + "," + alias).c_str(); 
} 

std::string 개체가 파괴되면 문자열 포인터가 무효화됩니다.

당신과 같이, 주변의 std::string을 유지할 필요가

:

std::string withAlias(std::string name, std::string name) 
{ 
    return name + "," + alias; 
} 

int main(int argc, char** argv) 
{ 
    po::options_description desc; 
    auto name = withAlias("compression", "c"); 

    desc.add_options() 
     (name.c_str(), po::value<int>(), "compression bla bla"); 
    ... 
+0

'const char *'가 복사되지 않았습니까? –

+0

서명을'std :: string withAlias'로 변경하려고 시도했으나 호출을 호출하는'.c_str()'이 여전히 실패합니다. –

+0

@GioraGuttsait, 네,하지만 그것은 단지 포인터 일뿐입니다. 기본 데이터는 다른 문제입니다. – Frank