您使用哪些软件包来处理命令行选项,设置和配置文件?
我正在寻找从命令行和/或配置文件中读取用户定义选项的内容。
选项(设置)应该可以分成不同的组,这样我就可以将不同的(子集)选项传递给我的代码中的不同对象。
我知道boost::program_options
,但我不太习惯API
。是否有轻量级替代品?
(顺便说一句,您是否曾在代码中使用可从任何地方读取的全局选项对象?或者您会认为这是邪恶的吗?)
答案 0 :(得分:11)
在Google,我们使用gflags。它不执行配置文件,但对于标志,它比使用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
。对测试也有很好的支持,因此单元测试可以独立设置不同的标志。
答案 1 :(得分:6)
对于命令行和C ++,我一直是TCLAP的粉丝:Templatized Command Line Argument Parser。
答案 2 :(得分:5)
好吧,你不会喜欢我的回答。我使用boost::program_options
。界面需要一些习惯,但是一旦你把它弄下来,它就太棒了。只需确保进行大量的单元测试,因为如果语法错误,将出现运行时错误。
而且,是的,我将它们存储在单个对象中(只读)。在这种情况下,我不认为这是邪恶的。这是我能想到的单身人士可以接受的少数案例之一。
答案 3 :(得分:3)
如果Boost对你来说有点矫枉过正,GNU Gengetopt可能也是,但恕我直言,这是一个有趣的工具。
而且,我试图远离全局选项对象,我更喜欢让每个类都读取自己的配置。除了整个“全球化是邪恶的”哲学之外,它最终会变得越来越混乱,将所有配置集中在一个地方,并且更难分辨出哪些配置变量在哪里使用。如果您将配置保持在更靠近使用位置的位置,那么每个配置的位置都更加明显,并且更容易保持清洁。
(关于我个人使用的内容,最近一切都是我公司其他人写的专有命令行解析库,但不幸的是,这对你没什么帮助)
答案 4 :(得分:3)
我现在已经使用TCLAP一两年了,但我偶然偶然发现了ezOptionParser。 ezOptionParser不会像其他选项解析器一样遭受“它不应该是这种复杂的”综合症。
到目前为止,我印象非常深刻,我可能会继续使用它,特别是因为它支持配置文件。 TCLAP是一个更复杂的库,但ezOptionParser的简单性和额外功能非常引人注目。
其网站的其他优惠包括(截至0.2.0):
答案 5 :(得分:1)
GNU getopt相当不错。如果你想要一个C ++的感觉,考虑getoptpp,它是本机getopt的包装器。 就配置文件而言,您应该尝试使其尽可能愚蠢,以便轻松解析。如果你有点体贴,你可能想要使用yaac&amp; lex,但这对于小型应用来说真的是一大笔钱。
我还建议您在应用程序中同时支持配置文件和命令行选项。配置文件更适合那些不经常更改的选项。当您想要传递即时更改的参数时(通常在您创建应用程序时,命令行选项很好),这将被其他程序调用。
答案 6 :(得分:1)
如果您在x86和x64 Windows上使用Visual Studio 2005,SimpleLibPlus library中有一些很好的命令行解析实用程序。我使用它并发现它非常有用。
答案 7 :(得分:0)
不确定命令行参数解析。我不需要在该领域拥有非常丰富的功能,并且通常自己动手以节省为我的软件添加更多依赖项。根据您的需求,您可能会或可能不想尝试这条路线。我编写的C ++程序通常不会从命令行调用。
另一方面,对于配置文件,您实际上无法击败基于XML的格式。它是可读的,可扩展的,结构化的......等等。还有很多XML解析器。尽管它是一个C库,但我倾向于使用xmlsoft.org中的libxml2。
答案 8 :(得分:-4)
试试Apache Ant。它的主要用途是Java项目,但没有任何关于它的Java,它几乎可以用于任何东西。
使用非常简单,您也获得了很多社区支持。以你提出的方式做事真的很擅长。
至于代码中的全局选项,我认为它们非常必要且有用。但是,不要滥用它们。