c++ - 命令行解析器忽略必需的选项

标签 c++ boost command-line-arguments

给定以下程序

#include <boost/program_options.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>

using namespace std;
namespace po = boost::program_options;

int main(int argc, const char *argv[]) {
    try {
        po::options_description global("Global options");
        global.add_options()
            ("x", po::value<int>()->required(), "The required x value");

        po::variables_map args;
        // shouldn't this throw an exception, when --x is not given?
        po::store(po::parse_command_line(argc, argv, global), args);

        // throws bad_any_cast
        cout << "x=" << args["x"].as<int>() << endl;
    } catch (const po::error& e) {
        std::cerr << e.what() << endl;
    }

    cin.ignore();
    return 0;
}

X 是必需的,但给定一个空命令行 parse_command_line 不会抛出异常。所以当我通过 args["x"] 访问 x 时它崩溃了。我得到了 bad_any_cast

最佳答案

调用 boost::program_options::store,顾名思义,只存储来自第一个参数的选项(这是一个 boost::program_options::basic_parsed_options ) 在 map 中作为第二个参数传递。要运行所需的检查并获得您期望的异常,您还必须显式调用 boost::program_options::notify:

po::store(po::parse_command_line(argc, argv, global), args);
po::notify(args);

关于c++ - 命令行解析器忽略必需的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36083125/

相关文章:

objective-c - 在 Objective-C 中使用命令行运行格式化 USB 驱动器时出错

bash - 使用大括号参数列表多次执行命令

c++ - 运行时堆栈溢出

c++ - 在 C++ 中,如何从声明中获取任意函数的类型?

C++ Google 风格 : Automatic correction

c++ - 推广还是不推广——这是一个问题

c++ - 循环调用 boost io_service poll

c - 后缀符号 - 堆栈弹出和推送帮助,内存地址打印而不是实际数字

c++ - unique_ptr、nullptr 并支持 gcc 4.5.x 和 4.6.x

c++ - 如何在 C++ 中比较并提取两个文件中最接近的数字