您使用哪些软件包来处理命令行选项、设置和配置文件?
我正在寻找一些可以从命令行和/或配置文件中读取用户定义的选项的工具。
这些选项(设置)应该可以分为不同的组,以便我可以将不同(子集)的选项传递给代码中的不同对象。
我知道有boost::program_options
,但我无法适应其API
。是否有轻量级的替代方案?
(顺便说一句,您是否会在代码中使用全局选项对象,以便可以从任何地方都能读取它?或者您认为那是一个邪恶的做法?)
您使用哪些软件包来处理命令行选项、设置和配置文件?
我正在寻找一些可以从命令行和/或配置文件中读取用户定义的选项的工具。
这些选项(设置)应该可以分为不同的组,以便我可以将不同(子集)的选项传递给代码中的不同对象。
我知道有boost::program_options
,但我无法适应其API
。是否有轻量级的替代方案?
(顺便说一句,您是否会在代码中使用全局选项对象,以便可以从任何地方都能读取它?或者您认为那是一个邪恶的做法?)
在 Google,我们使用 gflags。它不支持配置文件,但对于标识(flags),它比使用 getopt 要简单得多。
#include <gflags/gflags.h>
DEFINE_string(server, "foo", "What server to connect to");
int main(int argc, char* argv[]) {
google::ParseCommandLineFlags(&argc, &argv, true);
if (!server.empty()) {
Connect(server);
}
}
你需要将DEFINE_foo
放在需要知道标志值的文件的顶部。如果其他文件也需要知道该值,则在它们中使用DECLARE_foo
。此外,测试也有相当好的支持,因此单元测试可以独立设置不同的标志。
对于命令行和C++,我一直是TCLAP的拥护者:Templatized Command Line Argument Parser。
好的,你可能不会喜欢我的答案。我使用boost::program_options
。这个接口需要一些时间来适应,但一旦你掌握了它,就会感觉非常棒。只是要确保进行大量的单元测试,因为如果语法错误,你将会得到运行时错误。
是的,我将它们存储在一个单例对象中(只读)。在这种情况下,我认为它并不邪恶。这是我能想到的少数几种可以接受单例模式的情况之一。
我已经使用TCLAP一两年了,但偶然间我发现了ezOptionParser。 ezOptionParser没有像其他选项解析器一样遭受“不应该这么复杂”的综合症。
到目前为止,我很满意,并且可能会继续使用它,特别是因为它支持配置文件。 TCLAP是一个更复杂的库,但是ezOptionParser的简单性和额外功能非常令人信服。
其网站的其他优点包括(截至0.2.0):
GNU getopt非常好用。如果你想要C++的感觉,可以考虑使用getoptpp,它是对原生getopt的封装。
至于配置文件,你应该尽量让它变得简单,以便于解析。如果你稍微考虑一下,你可能会想使用yaac&lex,但这对于小型应用来说可能会花费很多钱。
我还想建议你在应用程序中同时支持配置文件和命令行选项。配置文件适用于那些不经常更改的选项。命令行选项适用于当你想传递即时更改参数时(通常是在创建一个被其他程序调用的应用程序时)。
如果您正在使用Visual Studio 2005在x86和x64 Windows上工作,SimpleLibPlus library中有一些很好的命令行解析工具。我曾经使用过它并发现它非常有用。
对于命令行参数解析,我不太确定。在这个领域,我并没有需要非常丰富的功能,通常会自己编写代码以避免增加软件的依赖项。根据您的需求,您可能想要尝试这种方法或者不想尝试。我编写的C++程序通常不是从命令行调用的。
另一方面,对于配置文件,基于XML的格式确实无可匹敌。它易读、可扩展、结构化等等... :) 而且有很多XML解析器可供选择。尽管它是一个C库,但我倾向于使用来自xmlsoft.org的libxml2。