Boost程序选项 - 从函数结果传递arg名称

时间:2017-09-03 21:53:28

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

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

当名称字符串中有,时,它会发生,但只有当它不是作为字符串文字传递时才会发生。

无法弄清楚造成这种情况的原因。

1 个答案:

答案 0 :(得分: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");
    ...