7

boost.program_options ライブラリを使用します。この単純化されたケースを考えてみましょう。

po::options_description desc("Usage");
desc.add_options()
("uninstall,u", "uninstall program")
("custom,c", po::wvalue<std::wstring>(), "specify custom action");

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);

そのようなコマンドラインでエラーを生成したい:

testprog.exe -u c- action1

ユーザーが「-c」ではなく「c-」とタイプミスしたことに注意してください。しかし、パーサーはこれを単一の -u オプションとして認識します。このような場合はどのように処理すればよいですか?

4

3 に答える 3

4

そのようなコマンドラインでエラーを生成したい:

testprog.exe -u c- action1

ユーザーが「-c」ではなく「c-」とタイプミスしたことに注意してください。しかし、パーサーはこれを単一の -u オプションとして認識します。このような場合はどのように処理すればよいですか?

program_options位置引数を受け入れないようにライブラリに指示すると、目的の動作が得られます

コードとコンパイル:

macmini:stackoverflow samm$ cat po.cc
#include <boost/program_options.hpp>
#include <boost/version.hpp>

#include <iostream>

int
main(int argc, char* argv[])
{
    namespace po = boost::program_options;
    po::options_description desc("Usage");
    desc.add_options()
        ("uninstall,u", "uninstall program")
        ("custom,c", po::wvalue<std::wstring>(), "specify custom action")
        ;

    po::variables_map vm;
    po::command_line_parser cmd_line( argc, argv );
    cmd_line.options( desc );
    cmd_line.positional( po::positional_options_description() );

    try {
        po::store( cmd_line.run(), vm );

        po::notify(vm);
    } catch ( const std::exception& e ) {
        std::cerr << e.what() << std::endl;
        return -1;
    }

    return 0;
}
macmini:stackoverflow samm$ g++ po.cc -I /opt/local/include -L/opt/local/lib -lboost_program_options -Wl,-rpath,/opt/local/lib

走る:

macmini:stackoverflow samm$ ./a.out -u c- action1
too many positional options
macmini:stackoverflow samm$ ./a.out -u -c action1
macmini:stackoverflow samm$ 
于 2011-10-28T03:05:25.347 に答える
2

?argc-1によって見つかった引数の数と比較します。program_options一致しない場合は、構文エラーがあります。

すべてのケースをキャッチできるわけではありませんが、重要なケースをキャッチできる場合があります。

于 2011-10-25T16:44:58.403 に答える
0

これを行う唯一の方法は、たとえば各タイプのカウントをテストするなどして、必要な各引数が存在することを確認することだと思います。

if (vm.count("uninstall")) { ... }
if (vm.count("custom")) { ... }

必要なオプションが存在しない場合 (つまり、count が 0)、または存在する場合 (たとえば-u、and-cを指定できない場合、count は両方とも is になります)、エラーを生成できます>0

于 2011-10-25T11:35:47.117 に答える