你如何处理命令行选项和配置文件?

时间:2009-06-13 04:30:04

标签: c++ command-line configuration-files options configuration-management

您使用哪些软件包来处理命令行选项,设置和配置文件?

我正在寻找从命令行和/或配置文件中读取用户定义选项的内容。

选项(设置)应该可以分成不同的组,这样我就可以将不同的(子集)选项传递给我的代码中的不同对象。

我知道boost::program_options,但我不太习惯API。是否有轻量级替代品?

(顺便说一句,您是否曾在代码中使用可从任何地方读取的全局选项对象?或者您会认为这是邪恶的吗?)

9 个答案:

答案 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。

http://sourceforge.net/projects/tclap/

答案 2 :(得分:5)

好吧,你不会喜欢我的回答。我使用boost::program_options。界面需要一些习惯,但是一旦你把它弄下来,它就太棒了。只需确保进行大量的单元测试,因为如果语法错误,出现运行时错误。

而且,是的,我将它们存储在单个对象中(只读)。在这种情况下,我不认为这是邪恶的。这是我能想到的单身人士可以接受的少数案例之一。

答案 3 :(得分:3)

如果Boost对你来说有点矫枉过正,GNU Gengetopt可能也是,但恕我直言,这是一个有趣的工具。

而且,我试图远离全局选项对象,我更喜欢让每个类都读取自己的配置。除了整个“全球化是邪恶的”哲学之外,它最终会变得越来越混乱,将所有配置集中在一个地方,并且更难分辨出哪些配置变量在哪里使用。如果您将配置保持在更靠近使用位置的位置,那么每个配置的位置都更加明显,并且更容易保持清洁。

(关于我个人使用的内容,最近一切都是我公司其他人写的专有命令行解析库,但不幸的是,这对你没什么帮助)

答案 4 :(得分:3)

我现在已经使用TCLAP一两年了,但我偶然偶然发现了ezOptionParser。 ezOptionParser不会像其他选项解析器一样遭受“它不应该是这种复杂的”综合症。

到目前为止,我印象非常深刻,我可能会继续使用它,特别是因为它支持配置文件。 TCLAP是一个更复杂的库,但ezOptionParser的简单性和额外功能非常引人注目。

其网站的其他优惠包括(截至0.2.0):

  • 完全打印已解析的输入以进行调试。
  • 以三种布局(对齐,交错或交错)创建自动使用消息。
  • 单头文件实现。
  • 仅依赖于STL。
  • 任意短期和长期选项名称(不需要短划线' - '或加+''前缀)。
  • 任意参数列表分隔符。
  • 允许多个标志实例。
  • 验证必需的选项,每个标志的预期参数数,数据类型范围,用户定义的范围,列表中的成员资格以及字符串列表的大小写。
  • 可由字符串或常量定义的验证标准。
  • 带注释的多个文件导入。
  • 导出到文件,设置选项或所有选项(包括默认值)。
  • 依赖于订单的上下文的选项解析索引。

答案 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,它几乎可以用于任何东西。

使用非常简单,您也获得了很多社区支持。以你提出的方式做事真的很擅长。

至于代码中的全局选项,我认为它们非常必要且有用。但是,不要滥用它们。