13

你用什么包来处理命令行选项、设置和配置文件?

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

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

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

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

4

9 回答 9

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在其中使用。对测试也有很好的支持,所以单元测试可以独立设置不同的标志。

于 2009-06-13T07:49:21.690 回答
6

对于命令行和 C++,我一直是 TCLAP 的粉丝:Templatized Command Line Argument Parser。

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

于 2009-06-15T01:49:07.967 回答
5

好吧,你不会喜欢我的回答。我用boost::program_options. 该界面需要一些时间来适应,但是一旦您将其关闭,那就太棒了。只要确保进行大量的单元测试,因为如果语法错误,就会出现运行时错误。

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

于 2009-06-13T06:52:03.123 回答
3

如果 Boost 对你来说太过分了,GNU Gengetopt也可能是,但恕我直言,它是一个有趣的工具。

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

(至于我个人使用的东西,最近它是我公司其他人编写的专有命令行解析库,但不幸的是,这对你没有多大帮助)

于 2009-06-13T06:15:08.763 回答
3

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

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

其网站的其他好处包括(截至 0.2.0):

  • 解析输入的漂亮打印以进行调试。
  • 在三种布局(对齐、交错或交错)中自动创建使用消息。
  • 单头文件实现。
  • 仅依赖于 STL。
  • 任意短和长选项名称(不需要破折号“-”或加“+”前缀)。
  • 任意参数列表分隔符。
  • 允许多个标志实例。
  • 验证所需选项、每个标志的预期参数数量、数据类型范围、用户定义范围、列表中的成员资格和字符串列表的大小写。
  • 可通过字符串或常量定义的验证标准。
  • 带注释的多个文件导入。
  • 导出到文件,设置选项或所有选项,包括可用的默认值。
  • 顺序相关上下文的选项解析索引。
于 2013-04-09T22:06:20.053 回答
1

GNU getopt 非常好。如果您想要 C++ 的感觉,请考虑getoptpp,它是原生 getopt 的包装器。就配置文件而言,你应该尽量让它变得愚蠢,以便于解析。如果你有点体贴,你可能会想使用 yaac&lex 但这对于小型应用程序来说确实是一大笔钱。

我还想建议您在应用程序中同时支持配置文件和命令行选项。配置文件更适合那些更改频率较低的选项。当您想要传递即时变化的参数时(通常是在您创建一个应用程序时,它会被其他程序调用),命令行选项非常有用。

于 2009-06-13T07:00:44.723 回答
1

如果您在 x86 和 x64 Windows 上使用 Visual Studio 2005,SimpleLibPlus 库中有一些很好的命令行解析实用程序。我用过它,发现它非常有用。

于 2009-06-13T13:50:05.050 回答
0

不确定命令行参数解析。我在该领域不需要非常丰富的功能,并且通常会推出自己的功能以节省向我的软件添加更多依赖项。根据您的需求,您可能想也可能不想尝试这条路线。我写的 C++ 程序一般不会从命令行调用。

另一方面,对于配置文件,您确实无法击败基于 XML 的格式。它是可读的、可扩展的、结构化的等等...... :) 另外还有很多 XML 解析器。尽管它是一个 C 库,但我倾向于使用来自 xmlsoft.org 的 libxml2。

于 2009-06-13T05:35:46.380 回答
-4

试试Apache Ant。它的主要用途是 Java 项目,但没有任何关于它的 Java,而且它几乎可用于任何事情。

使用相当简单,您也得到了很多社区支持。它真的很擅长按照你要求的方式做事。

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

于 2009-06-13T05:25:00.163 回答