【问题标题】:Boost Program Options is silently ignoring unknown value tokens. why?Boost Program Options 默默地忽略了未知的价值代币。为什么?
【发布时间】:2013-04-26 13:58:13
【问题描述】:

我正在使用 Boost Program Options 来解析 CLI。

我面临的问题是,如果 CLI 中有任何标记前面没有“-”或“--”,库会默默地忽略它而不是抛出异常。

以下是示例程序:

try
{
    options_description od;
    od.add_options()
        ("dummy,d", value<int>()->required(), "does nothing...");

    variables_map vm;
    wparsed_options po = parse_command_line(argc, argv, od);
    store(po, vm);
    notify(vm);

    cout << vm["dummy"].as<int>() << endl;
}
catch (const error& e)
{
    cout << e.what() << endl;
}

以下是一些示例运行:

Debug>test
the option '--dummy' is required but missing

Debug>test -d
the required argument for option '--dummy' is missing

Debug>test -d 1
1

Debug>test -d 1 asas
1

现在,前三个运行符合预期。但是,为什么第三次运行没有抛出任何异常? 'asas' 不匹配任何选项并且 -d 不接受向量。我究竟做错了什么?还是图书馆是这样设计的?

【问题讨论】:

    标签: boost-program-options


    【解决方案1】:
    1. 前面没有破折号的标记称为位置参数
    2. 您应该明确禁止预期行为的位置
    3. 为此创建空的位置列表并将其提供给解析器 https://stackoverflow.com/a/3859400/670719

    【讨论】:

    • 得到了预期的行为。遗憾的是,抛出的异常不包含导致异常的令牌(或令牌列表)。这使得向用户显示的消息非常模糊。
    • 您可以允许一个(和多个令牌,如果您愿意)位置,然后如果您在输入中获得位置,则手动打印包含不正确令牌的错误。
    • 好主意。但是,如果没有明确提及位置,人们会期望库默认抛出异常。如果设置了allow_unregistered,它应该收集这些令牌,但如果没有,那么库肯定会抛出异常。
    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多