C++ POCO命令行处理
C++ POCO command line processing
我正在尝试使用 Poco::Util::Application 创建一个小型应用程序,因为它可以立即为您提供一些东西,例如配置和记录器。它还为您提供的其中一件事是一个 config() 成员,它 returns 一个 LayeredConfiguration 对象。根据文档,可以使用setString和getString等方法。
但是,在解析命令行参数时,我一直坚持使用这个配置部分。这个问题似乎与可变范围有关。如果我使用回调函数并在 this->config() 对象中设置参数,则该值不会“固定”。一旦它 returns 到 main(),该值将被重置为默认值。
下面是一个最小的例子:
#include <Poco/Util/Application.h>
#include <Poco/Util/Option.h>
#include <Poco/Util/OptionSet.h>
#include <Poco/Util/OptionCallback.h>
#include <iostream>
class OptionExample : public Poco::Util::Application
{
protected:
void initialize(Poco::Util::Application& application){
this->config().setString("optionval", "defaultoption");
this->loadConfiguration();
Poco::Util::Application::initialize(application);
}
void uninitialize(){
Poco::Util::Application::uninitialize();
}
void defineOptions(Poco::Util::OptionSet& optionSet) {
Poco::Util::Application::defineOptions(optionSet);
optionSet.addOption(
Poco::Util::Option("optionval", "", "Some value")
.required(false)
.repeatable(true)
.argument("<the value>", true)
.callback(Poco::Util::OptionCallback<OptionExample>(this, &OptionExample::handleMyOpt))
);
}
void handleMyOpt(const std::string &name, const std::string &value) {
std::cout << "Setting option " << name << " to " << value << std::endl;
this->config().setString(name, value);
std::cout << "The option is now " << this->config().getString(name) << std::endl;
}
int main(const std::vector<std::string> &arguments) {
std::cout << "We are now in main. Option is " << this->config().getString("optionval") << std::endl;
}
};
POCO_APP_MAIN(OptionExample)
运行 没有命令行参数它按预期工作:
$ ./Minimal
We are now in main. Option is defaultoption
运行 它与命令行参数一起显示选项已设置。但是,在从 main() 获取选项后,它将被重置为默认值。
$ ./Minimal --optionval=mystring
Setting option optionval to mystring
The option is now mystring
We are now in main. Option is defaultoption
正如我所说,我预计变量范围会在这里某处杀死我。但是,我已经尝试过
等变体
Poco::Util::Application &application = Poco::Util::Application::instance();
std::cout << application.config().getString("optionval");
产生相同的结果。
POCO 的文档相对丰富。 github 上的源代码中有示例,但似乎缺少此特定内容。
谁能赐教一下?
答案似乎很简单。
显然,错误仅在 config().setString() 调用在 initialize() 中完成时出现。
通过将调用移至 defineOptions(),默认值按预期工作。
我正在尝试使用 Poco::Util::Application 创建一个小型应用程序,因为它可以立即为您提供一些东西,例如配置和记录器。它还为您提供的其中一件事是一个 config() 成员,它 returns 一个 LayeredConfiguration 对象。根据文档,可以使用setString和getString等方法。
但是,在解析命令行参数时,我一直坚持使用这个配置部分。这个问题似乎与可变范围有关。如果我使用回调函数并在 this->config() 对象中设置参数,则该值不会“固定”。一旦它 returns 到 main(),该值将被重置为默认值。
下面是一个最小的例子:
#include <Poco/Util/Application.h>
#include <Poco/Util/Option.h>
#include <Poco/Util/OptionSet.h>
#include <Poco/Util/OptionCallback.h>
#include <iostream>
class OptionExample : public Poco::Util::Application
{
protected:
void initialize(Poco::Util::Application& application){
this->config().setString("optionval", "defaultoption");
this->loadConfiguration();
Poco::Util::Application::initialize(application);
}
void uninitialize(){
Poco::Util::Application::uninitialize();
}
void defineOptions(Poco::Util::OptionSet& optionSet) {
Poco::Util::Application::defineOptions(optionSet);
optionSet.addOption(
Poco::Util::Option("optionval", "", "Some value")
.required(false)
.repeatable(true)
.argument("<the value>", true)
.callback(Poco::Util::OptionCallback<OptionExample>(this, &OptionExample::handleMyOpt))
);
}
void handleMyOpt(const std::string &name, const std::string &value) {
std::cout << "Setting option " << name << " to " << value << std::endl;
this->config().setString(name, value);
std::cout << "The option is now " << this->config().getString(name) << std::endl;
}
int main(const std::vector<std::string> &arguments) {
std::cout << "We are now in main. Option is " << this->config().getString("optionval") << std::endl;
}
};
POCO_APP_MAIN(OptionExample)
运行 没有命令行参数它按预期工作:
$ ./Minimal
We are now in main. Option is defaultoption
运行 它与命令行参数一起显示选项已设置。但是,在从 main() 获取选项后,它将被重置为默认值。
$ ./Minimal --optionval=mystring
Setting option optionval to mystring
The option is now mystring
We are now in main. Option is defaultoption
正如我所说,我预计变量范围会在这里某处杀死我。但是,我已经尝试过
等变体Poco::Util::Application &application = Poco::Util::Application::instance();
std::cout << application.config().getString("optionval");
产生相同的结果。
POCO 的文档相对丰富。 github 上的源代码中有示例,但似乎缺少此特定内容。
谁能赐教一下?
答案似乎很简单。
显然,错误仅在 config().setString() 调用在 initialize() 中完成时出现。
通过将调用移至 defineOptions(),默认值按预期工作。