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

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

Жанры

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

while ((ос = getopt(argc, argv, ":ab:")) != -1) {

 switch (oc) {

 case 'a':

/* обработка -a, установка соответствующего флага */

break;

 case 'b':

/* обработка -b, получение значения аргумента из optarg */

b_opt_arg = optarg;

break;

 case ':':

/* отсутствует аргумент опции */

fprintf(stderr, "%s: option '-%c' requires an argument\n",

argv[0], optopt);

break;

 case '?':

 default:

/* недействительная опция */

fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",

argv[0], optopt);

break;

 }

}

Замечание о соглашениях по именованию флагов или опций: в большом количестве кода для Unix используются имена в виде

xflg
для любого данного символа опции x (например,
nflg
в
echo
V7; обычным является также
xflag
). Это может быть замечательным для авторе программы, который без проверки документации знает, что означает опция x. Но это не подходит для кого-то еще, кто пытается прочесть код и не знает наизусть значений всех символов опций. Гораздо лучше использовать имена, передающие смысл опции, как
no_newline
для опции
– n
echo.

2.3.2. GNU

getopt
и порядок опций

Стандартная функция

getopt
прекращает поиск опций, как только встречает аргумент командной строки, который не начинается с GNU
getopt
отличается: она просматривает в поисках опций всю командную строку. По мере продвижения она переставляет элементы
argv
, так что после ее завершения все опции оказываются переставленными в начало, и код, продолжающий разбирать аргументы с
argv[optind]
до
argv[argc-1]
, работает правильно. Во всех случаях специальный аргумент '
– -
' завершает сканирование опций.

Вы можете изменить поведение по умолчанию, использовав в

optstring
специальный первый символ следующим образом:

optstring[0] == '+'

GNU

getopt
ведет себя, как стандартная
getopt
; она возвращает опции по мере их обнаружения, останавливаясь на первом аргументе, не являющемся опцией. Это работает также в том случае, если в окружении присутствует строка
POSIXLY_CORRECT
.

optstring[0] == '-'

GNU

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

Как и для стандартной

getopt
, если первым символом
optstring
является '
:
', GNU
getopt
различает «неверную опцию» и «отсутствующий аргумент опции», возвращая соответственно '
?
' или '
:
'. Символ '
:
' в
optstring
может быть вторым символом, если первым символом является '
+
' или '
'.

Наконец, если за символом опции в

optstring
следуют два двоеточия, эта опция может иметь необязательный аргумент. (Быстро повторите это три раза!) Такой аргумент считается присутствующим, если он находится в том же элементе
argv
, что и сама опция, и отсутствующим в противном случае. В случае отсутствия аргумента GNU
getopt
возвращает символ опции, а в
optarg
записывает NULL. Например, пусть имеем:

while ((с = getopt(argc, argv, "ab::")) != -1)

...

для

– bYANKEES
, возвращаемое значение будет '
b
', a
optarg
указывает на «
YANKEES
», тогда как для
– b
или '
– b YANKEES
' возвращаемое значение будет все то же '
b
', но в
optarg
будет помещен NULL. В последнем случае «
YANKEES
» представляет отдельный аргумент командной строки.

2.3.3. Длинные опции

Функция

getopt_long
осуществляет разбор длинных опций в описанном ранее виде. Дополнительная процедура
getopt_long_only
работает идентичным образом, но она используется для программ, в которых все опции являются длинными и начинаются с единичного символа '
'. В остальных случаях обе функции работают точно так же, как более простая функция GNU
getopt
. (Для краткости, везде, где мы говорим «
getopt_long
», можно было бы сказать «
getopt_long
и
getopt_long_only
».) Вот объявления функций из справки getopt(3) GNU/Linux:

#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
, который мы назовем таблицей длинных опций и который вскоре опишем. Параметр
longindex
, если он не установлен в NULL, указывает на переменную, в которую помешается индекс обнаруженной длинной опции в
longopts
. Это полезно, например, при диагностике ошибок.

2.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
» или «
verbose
».

int has_arg

Переменная описывает, имеет ли длинная опция аргумент, и если да, какого вида этот аргумент. Значение должно быть одно из представленных в табл. 2.1. Макроподстановки являются некоторыми символическими именами для числовых значений, приведенных в таблице. Хотя числовые значения тоже работают, макроподстановки гораздо легче читать, и вы должны их использовать вместо соответствующих чисел в любом коде, который пишете.

Поделиться:
Популярные книги

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Убивать чтобы жить 5

Бор Жорж
5. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 5

Санек 2

Седой Василий
2. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 2

Семь Нагибов на версту

Машуков Тимур
1. Семь, загибов на версту
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Семь Нагибов на версту

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение

Хозяин Теней 7

Петров Максим Николаевич
7. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 7

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 1 и Том 2

Сильнейший Столп Империи. Книга 2

Ермоленков Алексей
2. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 2

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Графиня с изъяном. Тайна живой стали

Лин Айлин
Фантастика:
фэнтези
героическая фантастика
киберпанк
5.00
рейтинг книги
Графиня с изъяном. Тайна живой стали