2017-09-03 32 views
0

我已經根據the official tutorial的示例複製了我的問題。增強程序選項 - 從函數結果傳遞參數名稱

#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; 
} 

當我運行我的程序:my_bin --compression 5,它拋出一個錯誤,他說: unrecognized option '--compression'

當我根本不使用別名(又名("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

相關問題