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

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

Жанры

Программирование для 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 */

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

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

Тузы за границей

Мартин Джордж Р.Р.
4. Дикие карты
Фантастика:
научная фантастика
7.14
рейтинг книги
Тузы за границей

Контртеррор

Валериев Игорь
6. Ермак
Фантастика:
альтернативная история
5.00
рейтинг книги
Контртеррор

Тишина

Бондарев Юрий Васильевич
Проза:
современная проза
8.40
рейтинг книги
Тишина

Гримуар темного лорда VI

Грехов Тимофей
6. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.20
рейтинг книги
Гримуар темного лорда VI

Башня Миров. Начало пути

Бельский Сергей Фёдорович
Фантастика:
фэнтези
боевая фантастика
4.00
рейтинг книги
Башня Миров. Начало пути

Год Мамонта

Романовский Владимир Дмитриевич
Троецарствие
Фантастика:
фэнтези
альтернативная история
7.17
рейтинг книги
Год Мамонта

Я – Малала

Юсуфзай Малала
Документальная литература:
биографии и мемуары
6.80
рейтинг книги
Я – Малала

Уникумы Вселенной

Иванович Юрий
1. Уникумы Вселенной
Фантастика:
боевая фантастика
космическая фантастика
7.29
рейтинг книги
Уникумы Вселенной

Двое, не считая призраков

Нестерова Наталья Владимировна
Проза:
современная проза
8.41
рейтинг книги
Двое, не считая призраков

Ваше Сиятельство 3

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

Прорицатель

Светлов Роман Викторович
Фантастика:
фэнтези
5.00
рейтинг книги
Прорицатель

Ловите конский топот. Том 1. Исхода нет, есть только выходы...

Звягинцев Василий Дмитриевич
15. Одиссей покидает Итаку
Фантастика:
альтернативная история
8.24
рейтинг книги
Ловите конский топот. Том 1. Исхода нет, есть только выходы...

Иллюстрированная Библия. Ветхий Завет

Коллектив авторов
Религия и эзотерика:
религия
5.00
рейтинг книги
Иллюстрированная Библия. Ветхий Завет

Мелодия души

Бэлоу Мэри
2. Марлоу и Кендрик
Любовные романы:
исторические любовные романы
8.30
рейтинг книги
Мелодия души