Linux программирование в примерах
Вы можете изменить поведение по умолчанию, использовав в
специальный первый символ следующим образом:optstringoptstring[0] == '+'GNU
ведет себя, как стандартнаяgetopt(); она возвращает опции по мере их обнаружения, останавливаясь на первом аргументе, не являющемся опцией. Это работает также в том случае, если в окружении присутствует строкаgetopt().POSIXLY_CORRECToptstring[0] == '-'GNU
возвращает каждый аргумент командной строки независимо от того, представляет он аргумент или нет. В этом случае для каждого такого аргумента функция возвращает целое 1, а указатель на соответствующую строку помещает вgetopt().optargКак и для стандартной
, если первым символомgetopt()является 'optstring', GNU:различает «неверную опцию» и «отсутствующий аргумент опции», возвращая соответственно 'getopt()' или '?'. Символ ':' в:может быть вторым символом, если первым символом является 'optstring' или '+'.-Наконец, если за символом опции в
следуют два двоеточия, эта опция может иметь необязательный аргумент. (Быстро повторите это три раза!) Такой аргумент считается присутствующим, если он находится в том же элементеoptstring, что и сама опция, и отсутствующим в противном случае. В случае отсутствия аргумента GNUargvвозвращает символ опции, а вgetopt()записывает NULL. Например, пусть имеем:optargwhile ((с = getopt(argc, argv, "ab::")) != -1)...для
, возвращаемое значение будет '-bYANKEES', abуказывает на «optarg», тогда как дляYANKEESили '-b' возвращаемое значение будет все то же '-b YANKEES', но вbбудет помещен NULL. В последнем случае «optarg» представляет отдельный аргумент командной строки.YANKEES2.3.3. Длинные опции
Функция
осуществляет разбор длинных опций в описанном ранее виде. Дополнительная процедураgetopt_long()работает идентичным образом, но она используется для программ, в которых все опции являются длинными и начинаются с единичного символа 'getopt_long_only()'. В остальных случаях обе функции работают точно так же, как более простая функция GNU-. (Для краткости, везде, где мы говорим «getopt()», можно было бы сказать «getopt_long()иgetopt_long()».) Вот объявления функций из справки getopt(3) GNU/Linux:getopt_long_only()#include <getopt.h> /* GLIBC */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, если он не установлен в NULL, указывает на переменную, в которую помешается индекс обнаруженной длинной опции вlongindex. Это полезно, например, при диагностике ошибок.longopts2.3.3.1. Таблица длинных опций
Длинные опции описываются с помощью массива структур
. Структураstruct optionопределена вstruct option; она выглядит следующим образом:<getopt.h>struct option {const char *name;int has_arg;int *flag;int val;};Элементы структуры следующие:
const char *nameЭто имя опции без предшествующих черточек, например, «
» или «help».verboseint has_argПеременная описывает, имеет ли длинная опция аргумент, и если да, какого вида этот аргумент. Значение должно быть одно из представленных в табл. 2.1. Макроподстановки являются некоторыми символическими именами для числовых значений, приведенных в таблице. Хотя числовые значения тоже работают, макроподстановки гораздо легче читать, и вы должны их использовать вместо соответствующих чисел в любом коде, который пишете.
int *flagЕсли этот указатель равен NULL,
возвращает значение поляgetopt_long()структуры. Если он не равен NULL, переменная, на которую он указывает, заполняется значениемval, avalвозвращает 0. Еслиgetopt_long()не равен NULL, но длинная опция отсутствует, указанная переменная не изменяется.flagint valЕсли длинная опция обнаружена, это возвращаемое значение или значение для загрузки в
, если*flagне равен NULL. Обычно, еслиflagне равен NULL,flagявляется значением true/false, вроде 1 или 0. С другой стороны, еслиvalравен NULL,flagобычно содержит некоторую символьную константу. Если длинная опция соответствует короткой, эта символьная константа должна быть той же самой, которая появляется в аргументеvalдля этой опции. (Все это станет вскоре ясно, когда мы рассмотрим несколько примеров.)optstring