Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

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. С другой стороны, если
flag
равен NULL,
val
обычно содержит некоторую символьную константу. Если длинная опция соответствует короткой, эта символьная константа должна быть той же самой, которая появляется в аргументе
optstring
для этой опции. (Все это станет вскоре ясно, когда мы рассмотрим несколько примеров.)

Таблица 2.1. Значения для

has_arg

Макроподстановка Числовое значение Смысл
no_argument
0 Опция не принимает аргумент
required_argument
1 Опции требуется аргумент
optional_argument
2 Аргумент опции является необязательным

У каждой длинной опции есть один такой элемент с соответствующими заполненными значениями. В последнем элементе массива все значения должны быть равны нулю. Нет необходимости сортировать массив:

getopt_long
осуществляет линейный поиск. Однако, сортировка его по длинным именам может упростить его чтение для программиста.

При первой встрече использование

flag
и
val
кажется сбивающим с толку. Давайте сделаем на время шаг назад и рассмотрим, почему это работает именно таким способом В большинстве случаев, обработка опций заключается в установке значений различных флаговых переменных при обнаружении различных символов опций, наподобие этого:

while ((с = getopt(argc, argv, ":af:hv")) != -1) {

 switch (с) {

 case 'a':

do_all = 1;

break;

 case 'f':

myfile = optarg;

break;

 case 'h':

do_help = 1;

break;

 case 'v':

do_verbose = 1;

break;

 ... /* Здесь обработка ошибок */

 }

}

Когда

flag
не равен NULL,
getopt_long
устанавливает значения переменных за вас. Это снижает число операторов
case
в предыдущем
switch
с трех до одного. Вот пример таблицы длинных опций и код для работы с ней:

int do_all, do_help, do_verbose; /* флаговые переменные */

char *my_file;

struct option longopts[] = {

 { "all", no_argument, &do_all, 1 },

 { "file", required_argument, NULL, 'f' },

 { "help", no_argument, &do_help, 1 },

 { "verbose", no_argument, &do_verbose, 1 },

 { 0, 0, 0, 0 }

};

while ((с =

 getopt_long(argc, argv, ":f:", longopts, NULL)) != -1) {

 switch (c) {

 case 'f':

myfile = optarg;

break;

 case 0:

/* getopt_long
устанавливает значение переменной,

просто продолжить выполнение */

break;

 ... /* Здесь обработка ошибок */

 }

}

Обратите внимание, что значение, переданное аргументу

optstring
, не содержит больше '
a
', '
h
' или '
v
'. Это означает, что соответствующие короткие опции неприемлемы. Чтобы разрешить как длинные, так и короткие опции, вам придется восстановить в
switch
соответствующие
case
из первого примера.

На практике следует писать свои программы так, чтобы у каждой короткой опции была также соответствующая длинная опция. В этом случае проще всего установить в

flag
NULL, а в
val
соответствующий единичный символ.

2.3.3.2. Длинные опции в стиле POSIX

Стандарт POSIX резервирует опцию

– W
для специфических для производителя возможностей. Поэтому по определению
– W
непереносимо между различными системами.

Если за

W
в аргументе
optstring
следует точка с запятой (обратите внимание не двоеточие),
getopt_long
рассматривает
– Wlongopt
так же, как
– -longopt
. Соответственно в предыдущем примере измените вызов следующим образом:

while ((с =

 getopt_long(argc, argv, ":f:W;", longopts, NULL)) != -1) {

С этим изменением

– Wall
является тем же, что и
– -all
, a
– Wfile=myfile
тем же, что
– -file=myfile
. Использование точки с запятой позволяет программе использовать при желании
– W
в качестве обычной опции. (Например, GCC использует ее как нормальную опцию, тогда как
gawk
использует ее для совместимости с POSIX.)

2.3.3 3. Сводка возвращаемых значений

getopt_long

Теперь должно быть ясно, что

getopt_long
предоставляет гибкий механизм для разбора опций. В табл. 2.2 приведена сводка всех возможных возвращаемых значений функции и их значение.

Таблица 2.2. Возвращаемые значения

getopt_long

Возвращаемый код Значение
0
getopt_long
установила флаг, как указано в таблице длинных опций
1
optarg
указывает на простой аргумент командной строки
'?' Недействительная опция
' ' Отсутствующий аргумент опции
'x' Символ опции 'x'
– 1 Конец опций
Поделиться:
Популярные книги

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Кодекс Крови. Книга VII

Борзых М.
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VII

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Переписка 1826-1837

Пушкин Александр Сергеевич
Документальная литература:
публицистика
5.00
рейтинг книги
Переписка 1826-1837

Предатель. Цена ошибки

Кучер Ая
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Предатель. Цена ошибки

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Родословная. Том 2

Ткачев Андрей Юрьевич
2. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 2

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье

Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Ланьлинский насмешник
Старинная литература:
древневосточная литература
7.00
рейтинг книги
Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Охота на разведенку

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
6.76
рейтинг книги
Охота на разведенку