Программирование для 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 */
/* Эта опция принимает аргумент -- имя выходного файла. */
Поделиться:
Популярные книги
Лекарь
2. Травник
Фантастика:
фэнтези
5.25
рейтинг книги
Наша навсегда
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Газлайтер. Том 27
27. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Искатель 1
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Я снова царь. Книга XXXIII
33. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Представитель
6. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Андер Арес
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга V
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга VIII
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Принц Ардена
Любовные романы:
исторические любовные романы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 11
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Иной. Том 5. Адская работа
5. Иной в голове
Фантастика:
боевая фантастика
городское фэнтези
технофэнтези
рпг
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 1
1. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00