增强程序选项 - 从函数结果传递参数名称
我已经根据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", ...)
)时,它按预期工作。
它发生在名称字符串中有,
,但只有当它不作为字符串文字传递时。
无法真正弄清楚是什么原因造成的。
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,是的,但这只是一个指针。基础数据是另一回事。 – Frank
你尝试' “-c, - 压缩”'? (现在读链接,可能不会工作) –
@ YuvalBen-Arie刚刚做了,没有工作,同样的错误 –