Роббинс Арнольд
Шрифт:
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.)
Жанры
- Романы
- Приключения
- Детективы
- Техно триллер
- Дамский детективный роман
- Исторические детективы
- Классические детективы
- Шпионские детективы
- Триллеры
- Юридический триллер
- Крутой детектив
- Полицейские детективы
- Медицинский триллер
- Иронические детективы
- Боевики
- Криминальные детективы
- Политические детективы
- Маньяки
- Зарубежные детективы
- Прочие Детективы
- Спецслужбы
- Драматургия
- Фантастика
- Хентай
- Ранобэ
- Сянься
- Дорама
- Уся
- Аниме
- Космоопера
- Юмористическая фантастика
- Боевая фантастика
- Героическая фантастика
- Технофэнтези
- Готический роман
- Социально-философская фантастика
- Попаданцы
- Историческая фантастика
- Ироническая фантастика
- Зарубежная фантастика
- Историческое фэнтези
- Юмористическое фэнтези
- Детективная фантастика
- Эпическая фантастика
- Мистика
- Космическая фантастика
- Фантастика: прочее
- Постапокалипсис
- Научная фантастика
- Киберпанк
- Альтернативная история
- Ненаучная фантастика
- РПГ
- Стимпанк
- Ироническое фэнтези
- Ужасы и мистика
- Сказочная фантастика
- Фэнтези
- Городское фэнтези
- Эзотерика
- Проза
- Военная проза
- Легкая проза
- Сентиментальная проза
- Советская классическая проза
- Антисоветская литература
- Афоризмы
- Эпистолярная проза
- Новелла
- Семейный роман
- Рассказ
- Классическая проза
- Эпопея
- Эссе
- Проза прочее
- Повесть
- Магический реализм
- Современная проза
- Контркультура
- Роман
- Историческая проза
- Русская классическая проза
- Феерия
- Стихи и поэзия
- Юмор
- Дом и досуг
- Рыбалка
- Охота
- Здоровье детей
- Домашние животные
- Воспитание детей
- Отдых / туризм
- Зарубежная прикладная литература
- Прочее домоводство
- Прикладная литература
- Домашнее хозяйство
- Кулинария
- Медицина и здоровье
- Сделай сам
- Спорт
- Хобби и ремесла
- Образовательная литература
- Сад и Огород
- Здоровье и красота
- Развлечения
- Коллекционирование
- Секс / секс-руководства
- Образование и наука
- Боевые искусства
- Органическая химия
- Обществознание
- Военная история
- Ветеринария
- Ораторское искусство / риторика
- Физика
- Химия
- Семейная психология
- Военная техника и вооружение
- Иностранные языки
- Прочая научная литература
- Психотерапия и консультирование
- Биохимия
- Cпецслужбы
- Астрономия и Космос
- Школьные учебники
- Учебная и научная литература
- Учебники
- Государство и право
- Психология
- Литературоведение
- История
- Научно-популярная литература
- Политика
- Детская психология
- Юриспруденция
- Шпаргалки
- Педагогика
- Физическая химия
- Медицина
- Биофизика
- Языкознание
- Зарубежная образовательная литература
- Зоология
- Геология и география
- Краткое содержание
- Зарубежная психология
- Саморазвитие / личностный рост
- Технические науки
- Религиоведение
- Военное дело
- Личная эффективность
- Аналитическая химия
- Рефераты
- Экология
- Философия
- Альтернативная медицина
- Математика
- Культурология
- Военное дело: прочее
- Ботаника
- Биология
- Словари и Энциклопедии
- Финансы и бизнес
- Отраслевые издания
- Бухучет и аудит
- Недвижимость
- Деловая литература
- Ценные бумаги
- Внешнеэкономическая деятельность
- Торговля
- Зарубежная деловая литература
- О бизнесе популярно
- Стартапы и создание бизнеса
- Корпоративная культура
- Управление, подбор персонала
- Маркетинг, PR, реклама
- Личные финансы
- Работа с клиентами
- Менеджмент
- Интернет-бизнес
- Поиск работы, карьера
- Малый бизнес
- Делопроизводство
- Государственное и муниципальное управление
- Банковское дело
- Экономика
- Книги по IT
- Техника
- Древние книги
- Документальное
- Прочее
- Интерьеры
- Газеты и журналы
- Театр
- Музыка
- Комиксы / манга
- Зарубежная классика
- Современная зарубежная литература
- Изобразительное искусство, фотография
- Мода и стиль
- Искусство и Дизайн
- Зарубежная литература о культуре и искусстве
- Фанфик
- Подростковая литература
- Шахматы
- Кино
- Культура и искусство
- Недописанное
- Классическая литература
- Без Жанра
- Народные
- Книги Для Детей
- Детские остросюжетные
- Сказки
- Детские стихи
- Прочая детская литература
- Детская образовательная литература
- Книги для дошкольников
- Детская фантастика
- Детские детективы
- Книга-игра
- Детский фольклор
- Буквари
- Детская проза
- Детская познавательная и развивающая литература
- Внеклассное чтение
- Зарубежные детские книги
- Детские приключения
Сейчас Читают
Болотник 3
Панченко Андрей Алексеевич
Сумеречный стрелок 6
Карелин Сергей Витальевич
На границе империй. Том 7. Часть 4
INDIGO
Её (мой) ребенок
Рам Янка
Новик
Ланцов Михаил Алексеевич
Боги, пиво и дурак. Том 3
Горина Юлия Николаевна
Кодекс Крови. Книга VIII
Борзых М.
Ванька-ротный
Шумилин Александр Ильич
Мастер темных Арканов
Карелин Сергей Витальевич
Темный Патриарх Светлого Рода 2
Лисицин Евгений