Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::program_options在指定意外的位置参数时不会报告错误_C++_Boost_Boost Program Options - Fatal编程技术网

C++ boost::program_options在指定意外的位置参数时不会报告错误

C++ boost::program_options在指定意外的位置参数时不会报告错误,c++,boost,boost-program-options,C++,Boost,Boost Program Options,下面是一个使用boost解析选项的简单程序: #include <iostream> #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int argc, char **argv) { try { size_t param = std::numeric_limits<size_t>::max();

下面是一个使用boost解析选项的简单程序:

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

namespace po = boost::program_options;

int main(int argc, char **argv) 
{
    try
    {
        size_t param = std::numeric_limits<size_t>::max();

        po::options_description desc("Syntax: [options] \"input binary file\".\nAllowed options:");
        desc.add_options()
            ("help,h", "produce help message")
            ("param,p", po::value<size_t>(&param), "param");

        po::variables_map vm;
        po::store(po::parse_command_line(argc, argv, desc), vm);
        po::store(po::command_line_parser(argc, argv).options(desc).run(), vm);
        po::notify(vm);

        if (vm.count("help")) 
        {
            std::cout << desc << "\n";
        }
        else
        {
            std::cout << "Running with param " << param << std::endl;
            return 0;
        }
    }
    catch(std::exception& e) {
        std::cerr << "error: " << e.what() << "\n";
    }
    catch(...) {
        std::cerr << "Exception of unknown type!\n";
    }
    return 1;
}
#包括
#包括
名称空间po=boost::program\u选项;
int main(int argc,字符**argv)
{
尝试
{
大小参数=标准::数值限制::最大值();
po::options\u description desc(“语法:[options]\“输入二进制文件\”\n所有选项:”);
说明添加选项()
(“帮助,h”,“生成帮助消息”)
(“参数,p”,po::value(¶m),“param”);
变量映射虚拟机;
po::store(po::parse_命令行(argc、argv、desc)、vm);
po::store(po::命令行解析器(argc,argv).options(desc.run(),vm);
po::通知(vm);
if(vm.count(“帮助”))
{

默认情况下接受std::cout位置。您可以检查是否未收到任何位置,也可以指定不允许任何位置:

po::positional_options_description positionals;
po::store(po::command_line_parser(args.size(), args.data())
                .options(desc)
                .positional(positionals)
                .run(),
演示

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

namespace po = boost::program_options;

int main() {
    std::vector<char const*> const cases[] = {
        { "hex2txt.exe" }, // outputs Running with param 0
        { "hex2txt.exe", "--param", "3" }, // outputs Running with param 3
        { "hex2txt.exe", "--toto" }, // outputs error: unrecognised option '--toto'
        // All this is expected, however:
        { "hex2txt.exe", "foo" }, // outputs Running with param 0
    };

    for (auto args : cases) {
        std::cout << "------";
        for (auto arg : args)
            std::cout << " " << std::quoted(arg);
        std::cout << "\n";

        try {
            size_t param = 0; // std::numeric_limits<size_t>::max();

            po::options_description desc(
                "Syntax: [options] \"input binary file\".\nAllowed options:");
            desc.add_options()("help,h", "produce help message")(
                "param,p", po::value<size_t>(&param), "param");

            po::positional_options_description positionals;

            po::variables_map vm;
            po::store(po::command_line_parser(args.size(), args.data())
                    .options(desc)
                    .positional(positionals)
                    .run(),
                vm);
            po::notify(vm);

            if (vm.count("help")) {
                std::cout << desc << "\n";
            } else {
                std::cout << "Running with param " << param << std::endl;
                //return 0;
            }
        } catch (std::exception const& e) {
            std::cerr << "error: " << e.what() << "\n";
        } catch (...) {
            std::cerr << "Exception of unknown type!\n";
        }
    }
}

您的代码有两个相互竞争的命令行解析运行+存储。这是多余的,可能会产生令人惊讶的效果(我没有想到一个例子)。
------ "hex2txt.exe"
Running with param 0
------ "hex2txt.exe" "--param" "3"
Running with param 3
------ "hex2txt.exe" "--toto"
error: unrecognised option '--toto'
------ "hex2txt.exe" "foo"
error: too many positional options have been specified on the command line