Параметры программы Boost - передать имя аргумента из результата функции

Я воспроизвел свою проблему на примере из официальное руководство.

#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", ...)), это работает, как и ожидалось.

Это происходит, когда в строке имени есть ,, но только когда оно передается не как строковый литерал.

Не могу понять, чем это вызвано.


person Giora Guttsait    schedule 03.09.2017    source источник
comment
Вы пробовали "-c,--compression"? (прочитайте сейчас ссылку, вероятно, не будет работать)   -  person Yuval Ben-Arie    schedule 04.09.2017
comment
@YuvalBen-Arie только что сделал, не сработало, та же ошибка   -  person Giora Guttsait    schedule 04.09.2017


Ответы (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");
    ...
person Frank    schedule 03.09.2017
comment
Разве const char* не скопировано? - person Giora Guttsait; 04.09.2017
comment
Я попытался изменить подпись на std::string withAlias и .c_str() вызвать ее, все равно не получается. - person Giora Guttsait; 04.09.2017
comment
@GioraGuttsait, да, но это всего лишь указатель. Исходные данные — другое дело. - person Frank; 04.09.2017
comment
Так как бы вы предложили сохранить его живым? - person Giora Guttsait; 04.09.2017
comment
@GioraGuttsait Вам нужно, чтобы сам объект std::string прожил достаточно долго, чтобы повысить скорость чтения данных. c_str() с результатом по-прежнему имеет ту же проблему, поскольку она временная. - person Frank; 04.09.2017
comment
@GioraGuttsait Обновил мой ответ примером - person Frank; 04.09.2017
comment
Большое спасибо, @Frank, обновил мой код (как образец кода, так и оболочку, которую я пытаюсь создать), и это, безусловно, то, на что вы указали. Спасибо, чувак! Хорошего дня! - person Giora Guttsait; 04.09.2017