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

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

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

Список возможных длинных опций задается в виде массива структур

option
. Каждый элемент массива соответствует одной опции и состоит из четырех полей. Чаще всего первое поле содержит имя опции (строка символов без ведущих дефисов), второе — 1, если опция принимает аргумент, и 0 — в противном случае: третье —
NULL
; четвертое — символьная константа, задающая короткий эквивалент данной длинной опции. Последний элемент массива должен содержать одни нули. Наш массив будет выглядеть так:

const struct option long_options[] = {

 { "help", 0, NULL, 'h' },

 { "output", 1, NULL, 'o' },

 { "verbose", 0, NULL, 'v' },

 { NULL, 0, NULL, 0 }

};

Функции

getopt_long
передаются также параметры
argc
и
argv
функции
main
. Ниже перечислены особенности ее работы.

■ При каждом вызове функция

getopt_long
анализирует очередную опцию, возвращая букву, которая соответствует короткому эквиваленту опции. При отсутствии опций возвращается -1.

■ Обычно функция

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

■ Если опция

getopt_long
обнаруживает неправильную опцию (т.е. она не указана в списке коротких и длинных опций), она выводит сообщение об ошибке и возвращает символ
?
(знак вопроса). В ответ на это большинство программ завершает свою работу, обычно отображая справку по работе с программой.

■ При обработке опции, имеющей аргумент, в глобальную переменную

optarg
помещается указатель на строку с содержимым аргумента.

■ Когда функция

getopt_long
завершает анализ опций, в глобальную переменную
optind
записывается индекс того элемента массива
argv
, в котором содержится первый аргумент, не являющийся опцией.

В листинге 2.2 приведен пример обработки аргументов программы с помощью функции

getopt_long
.

Листинг 2.2. (getopt_long.c) Использование функции
getopt_long

#include <getopt.h>

#include <stdio.h>

#include <stdlib.h>

/* Имя программы. */

const char* program_name;

/* Вывод информации об использовании программы в поток STREAM

(обычно stdout или stderr) и завершение работы с выдачей кода

EXIT_CODE. Возврат в функцию main не происходит */

void print_usage(FILE* stream, int exit_code) {

 fprintf(stream, "Usage: %s options [ inputfile ... ]\n",

program_name);

 fprintf(stream,

" -h --help Display this usage

information.\n"

" -о --output filename Write output to file.\n"

" -v --verbose Print verbose messages.\n");

 exit(exit_code);

}

/*
Точка входа в основную программу, параметр ARGC содержит размер

списка аргументов; параметр ARGV -- это массив указателей

на аргументы. */

int main(int argc, char* argv[]) (

 int next_option;

 /* Строка с описанием возможных коротких опций. */

 const char* const short_options = "ho:v";

 /* Массив с описанием возможных длинных опций. */

 const struct option long_options[] = {

{ "help", 0, NULL, 'h' },

{ "output", 1, NULL, 'o' },

{ "verbose", 0, NULL, 'v' },

{ NULL, 0, NULL, 0 } /* Требуется в конце массива. */

 };

 /* Имя файла, в который записываются результаты работы

программы, или NULL, если вывод направляется в поток

stdout. */

 const char* output_filename = NULL;

 /* Следует ли выводить развернутые сообщения. */

 int verbose = 0;

 /* Запоминаем имя программы, которое будет включаться

в сообщения. Оно хранится в элементе argv[0] */

 program_name = argv[0];

 do {

next_option =

getopt_long(argc, argv, short_options,

long_options, NULL);

switch(next_opt ion) {

case "h": /* -h или --help */

/* Пользователь запросил информацию об использовании

программы, нужно вывести ее в поток stdout и завершить

работу с выдачей кода 0 (нормальное завершение). */

print_usage(stdout, 0);

case 'o': /* -о или --output */

/* Эта опция принимает аргумент -- имя выходного файла. */

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

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

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

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

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

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

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

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит