Linux программирование в примерах
Таблица 2.1. Значения для
has_arg
Макроподстановка Числовое значение Смысл no_argument0 Опция не принимает аргумент required_argument1 Опции требуется аргумент optional_argument2 Аргумент опции является необязательным У каждой длинной опции есть один такой элемент с соответствующими заполненными значениями. В последнем элементе массива все значения должны быть равны нулю. Нет необходимости сортировать массив:
осуществляет линейный поиск. Однако, сортировка его по длинным именам может упростить его чтение для программиста.getopt_long()При первой встрече использование
иflagкажется сбивающим с толку. Давайте сделаем на время шаг назад и рассмотрим, почему это работает именно таким способом В большинстве случаев, обработка опций заключается в установке значений различных флаговых переменных при обнаружении различных символов опций, наподобие этого:valwhile ((с = 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;... /* Здесь обработка ошибок */}}Когда
не равен NULL,flagустанавливает значения переменных за вас. Это снижает число операторовgetopt_long()в предыдущемcaseс трех до одного. Вот пример таблицы длинных опций и код для работы с ней:switchint 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На практике следует писать свои программы так, чтобы у каждой короткой опции была также соответствующая длинная опция. В этом случае проще всего установить в
NULL, а вflagсоответствующий единичный символ.val2.3.3.2. Длинные опции в стиле POSIX
Стандарт POSIX резервирует опцию
для специфических для производителя возможностей. Поэтому по определению-Wнепереносимо между различными системами.-WЕсли за
в аргументеWследует точка с запятой (обратите внимание не двоеточие),optstringрассматриваетgetopt_long()так же, как-Wlongopt. Соответственно в предыдущем примере измените вызов следующим образом:--longoptwhile ((с =getopt_long(argc, argv, ":f:W;", longopts, NULL)) != -1) {С этим изменением
является тем же, что и-Wall, a--allтем же, что-Wfile=myfile. Использование точки с запятой позволяет программе использовать при желании--file=myfileв качестве обычной опции. (Например, GCC использует ее как нормальную опцию, тогда как-Wиспользует ее для совместимости с POSIX.)gawk2.3.3 3. Сводка возвращаемых значений
getopt_long()Теперь должно быть ясно, что
предоставляет гибкий механизм для разбора опций. В табл. 2.2 приведена сводка всех возможных возвращаемых значений функции и их значение.getopt_long()Таблица 2.2. Возвращаемые значения
getopt_long()
Возвращаемый код Значение 0 установила флаг, как указано в таблице длинных опцийgetopt_long()1 указывает на простой аргумент командной строкиoptarg'?' Недействительная опция ' ' Отсутствующий аргумент опции 'x' Символ опции 'x' -1 Конец опций