Linux программирование в примерах | страница 37
осуществляет разбор длинных опций в описанном ранее виде. Дополнительная процедура >getopt_long_only()
работает идентичным образом, но она используется для программ, в которых все опции являются длинными и начинаются с единичного символа '>-
'. В остальных случаях обе функции работают точно так же, как более простая функция GNU >getopt()
. (Для краткости, везде, где мы говорим «>getopt_long()
», можно было бы сказать «>getopt_long()
и >getopt_long_only()
».) Вот объявления функций из справки getopt(3) GNU/Linux:
>#include
>int getopt_long(int argc, char *const argv[],
> const char *optstring,
> const struct option *longopts, int *longindex);
>int getopt_long_only(int argc, char *const argv[],
> const char *optstring,
> const struct option *longopts, int *longindex);
Первые три аргумента те же, что и в >getopt()
. Следующая опция является указателем на массив >struct option
, который мы назовем таблицей длинных опций и который вскоре опишем. Параметр >longindex
, если он не установлен в NULL, указывает на переменную, в которую помешается индекс обнаруженной длинной опции в >longopts
. Это полезно, например, при диагностике ошибок.
2.3.3.1. Таблица длинных опций
Длинные опции описываются с помощью массива структур >struct option
. Структура >struct option
определена в >
; она выглядит следующим образом:
>struct option {
> const char *name;
> int has_arg;
> int *flag;
> int val;
>};
Элементы структуры следующие:
>const char *name
Это имя опции без предшествующих черточек, например, «>help
» или «>verbose
».
>int has_arg
Переменная описывает, имеет ли длинная опция аргумент, и если да, какого вида этот аргумент. Значение должно быть одно из представленных в табл. 2.1. Макроподстановки являются некоторыми символическими именами для числовых значений, приведенных в таблице. Хотя числовые значения тоже работают, макроподстановки гораздо легче читать, и вы должны их использовать вместо соответствующих чисел в любом коде, который пишете.
>int *flag
Если этот указатель равен NULL, >getopt_long()
возвращает значение поля >val
структуры. Если он не равен NULL, переменная, на которую он указывает, заполняется значением >val
, a >getopt_long()
возвращает 0. Если >flag
не равен NULL, но длинная опция отсутствует, указанная переменная не изменяется.
>int val
Если длинная опция обнаружена, это возвращаемое значение или значение для загрузки в >*flag
, если >flag
не равен NULL. Обычно, если >flag
не равен NULL, >val
является значением true/false, вроде 1 или 0. С другой стороны, если