Как сделать параметры командной строки обязательными с Бойким?

Я использую Бойкий для парсинга некоторых параметров командной строки. Проблема состоит в том, что я хочу сделать две из тех опций обязательными так, чтобы программа завершилась с экраном справки, если пользователь опускает их.

Мой код похож на это:

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. Как я могу сказать Бойкий приводить парсинг к сбою, если пользователь не передает обе опции командной строке? Возможно, я являюсь просто слепым, но я не мог найти флаг, который я могу поместить в свою структуру данных GOptionEntry, чтобы сказать этому делать те поля обязательными.

Конечно, я мог проверить, все еще ли одна из тех переменных-1, но затем пользователь, возможно, просто передал это значение командной строке, и я хочу распечатать отдельное сообщение об ошибке, если значения вне диапазона.

5
задан ahe 24 April 2010 в 13:36
поделиться

2 ответа

Вы должны проверить корректность аргумента (помимо синтаксического анализа), что также относится к getopt . Проблема в том, что делая вещи «обязательными», вы часто будете сталкиваться со случаями, когда «обязательные» применяются только при отсутствии других аргументов.

Например, ./ program --help не требует дополнительных аргументов, как и для ./ program --version . Использование логики «требовать --foo и --bar, если --version ИЛИ --help» в самом синтаксическом анализаторе граничит с раздуванием и чрезмерной сложностью.

Вы просто должны проверить значение строки и столбца после анализа аргументов, чтобы убедиться, что они были установлены на что-то. Вполне возможно поместить всю эту логику в функцию (например, check_sanity () ), если вас беспокоит беспорядок в main () .

Таким образом, поведение, которое вы наблюдаете, является преднамеренным, и я не думаю, что оно изменится. Если какая-либо переменная остается в том виде, в котором она была инициализирована после запуска анализатора, пользователь забыл указать соответствующую опцию.

9
ответ дан 18 December 2019 в 14:43
поделиться

Невозможно добиться с помощью GLib, я проверил документацию и исходный код. Вы можете отправить запрос функции и / или жить с предложенным обходным путем, несмотря на упомянутый недостаток.

2
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: