Я использую Бойкий для парсинга некоторых параметров командной строки. Проблема состоит в том, что я хочу сделать две из тех опций обязательными так, чтобы программа завершилась с экраном справки, если пользователь опускает их.
Мой код похож на это:
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, но затем пользователь, возможно, просто передал это значение командной строке, и я хочу распечатать отдельное сообщение об ошибке, если значения вне диапазона.
Вы должны проверить корректность аргумента (помимо синтаксического анализа), что также относится к getopt
. Проблема в том, что делая вещи «обязательными», вы часто будете сталкиваться со случаями, когда «обязательные» применяются только при отсутствии других аргументов.
Например, ./ program --help
не требует дополнительных аргументов, как и для ./ program --version
. Использование логики «требовать --foo и --bar, если --version ИЛИ --help» в самом синтаксическом анализаторе граничит с раздуванием и чрезмерной сложностью.
Вы просто должны проверить значение строки
и столбца
после анализа аргументов, чтобы убедиться, что они были установлены на что-то. Вполне возможно поместить всю эту логику в функцию (например, check_sanity ()
), если вас беспокоит беспорядок в main ()
.
Таким образом, поведение, которое вы наблюдаете, является преднамеренным, и я не думаю, что оно изменится. Если какая-либо переменная остается в том виде, в котором она была инициализирована после запуска анализатора, пользователь забыл указать соответствующую опцию.
Невозможно добиться с помощью GLib, я проверил документацию и исходный код. Вы можете отправить запрос функции и / или жить с предложенным обходным путем, несмотря на упомянутый недостаток.