5

私はいくつかのコマンドライン オプションを解析するために GLib を使用しています。問題は、ユーザーがそれらを省略した場合にプログラムがヘルプ画面で終了するように、これらのオプションのうち 2 つを必須にしたいことです。

私のコードは次のようになります。

static gint line   = -1;
static gint column = -1;

static GOptionEntry options[] =
{
    {"line", 'l', 0, G_OPTION_ARG_INT, &line, "The line", "L"},
    {"column", 'c', 0, G_OPTION_ARG_INT, &column, "The column", "C"},
    {NULL}
};

...

int main(int argc, char** argv)
{
    GError *error = NULL;
    GOptionContext *context;

    context = g_option_context_new ("- test");
    g_option_context_add_main_entries (context, options, NULL);

    if (!g_option_context_parse(context, &argc, &argv, &error))
    {
        usage(error->message, context);
    }

    ...

    return 0;
}

コマンドラインでこれらのパラメーターのいずれかまたは両方を省略した場合でも、g_option_context_parse() は成功し、問題の値 (行または列) は依然として -1 です。ユーザーがコマンドラインで両方のオプションを渡さない場合、GLib に解析を失敗させるにはどうすればよいですか? 多分私は目が見えないだけかもしれませんが、これらのフィールドを必須にするように GOptionEntry データ構造に入れることができるフラグが見つかりませんでした。

もちろん、これらの変数のいずれかがまだ -1 であるかどうかを確認することはできますが、ユーザーがコマンドラインでこの値を渡した可能性があり、値が範囲外の場合は別のエラー メッセージを出力したいと考えています。

4

3 に答える 3

8

引数の健全性を (解析を超えて) チェックするのはあなた次第ですgetopt。問題は、物事を「必須」にするとき、他の引数がない場合にのみ「必須」が適用される場合によく遭遇することです。

たとえば、の場合./program --helpと同様に、追加の引数は必要ありません./program --version。パーサー自体に「--version または --help でない限り、--foo と --bar が必要」というロジックを入れると、肥大化と過度の複雑さの境界になります。

引数が解析された後の値をチェックして、それらが何かに設定されていることを確認する必要がありlineます。の混乱が心配な場合はcolumn、そのすべてのロジックを関数 (たとえば ) に入れることは完全に可能です。check_sanity()main()

要約すると、表示されている動作は設計によるものであり、変更される可能性は低いと思います。パーサーの実行後にいずれかの変数が初期化されたままになっている場合、ユーザーはそれぞれのオプションを指定するのを忘れています。

于 2010-04-24T14:19:09.443 に答える
2

GLib で実現することは不可能です。ドキュメントとソース コードを確認しました。前述の欠点にもかかわらず、機能リクエストを送信したり、提案された回避策を実行したりすることができます。

于 2010-04-24T14:10:45.023 に答える