【问题标题】:Boost program options - pass arg name from function resultBoost 程序选项 - 从函数结果中传递参数名称
【发布时间】:2017-09-03 21:53:28
【问题描述】:

我已经根据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", ...))时,这将按预期工作。

当名称字符串中有 , 时会发生这种情况,但仅当它不是作为字符串文字传递时。

无法真正弄清楚是什么原因造成的。

【问题讨论】:

  • 你试过"-c,--compression"吗? (现在阅读链接,可能不起作用)
  • @YuvalBen-Arie 刚刚做了,没用,同样的错误

标签: c++ boost boost-program-options


【解决方案1】:
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");
    ...

【讨论】:

  • const char*不是被复制了吗?
  • 我尝试将签名更改为 std::string withAlias.c_str() 调用它,仍然失败。
  • @GioraGuttsait,是的,但这只是一个指针。基础数据是另一回事。
  • 那么你建议如何让它活着?
  • @GioraGuttsait 您需要 std::string 对象本身的寿命足够长,以便 boost 读取数据。 c_str() 结果仍然有同样的问题,因为它是临时的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2011-12-31
  • 2021-07-27
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多