Библиотека popt
является в высшей степени доступной и может работать на любой POSIX-платформе. Самую последнюю версию библиотеки можно найти по адресу ftp://ftp.rpm.org/pub/rpm. Библиотека popt
обладает целым рядом функциональных возможностей, не упоминаемых в этой главе; их описание можно найти на man-странице для popt.
Библиотека popt
может распространяться либо под лицензией General Public License GNU, либо под лицензией Library General Public License GNU.
26.1.1. Определение параметров
Приложения передают библиотеке popt
информацию о своих параметрах командной строки через массив структур struct poptOption
.
#include
struct poptOption {
const char * longName; /* может иметь значение NULL */
char shortName; /* может иметь значение '\0' */
int argInfo;
void * arg; /* зависит от argInfo */
int val; /*0 означает не возвращаться, а просто обновить флаг*/
char * descrip; /* необязательное описание параметра */
char * argDescrip; /* необязательное описание аргумента */
};
Каждый элемент таблицы определяет один параметр, который может быть передан программе. Длинные и короткие параметры рассматриваются как один параметр, который может встречаться в двух различных формах. Первые два элемента, longName
и shortName
, определяют имена параметров; первый соответствует длинному имени, а второй — одиночный символ.
Элемент argInfo
сообщает библиотеке popt
о том, какой тип аргумента ожидается после параметра. Если не ожидается никакого параметра, будет использоваться значение РОPT_ARG_NONE
. Остальные допустимые значения перечислены в табл. 26.1 [182] Те, кто знаком с функцией getopt() , заметят, что argInfo является единственным обязательным членом структуры struct poptOption , который отличается от члена в таблице аргументов getoptlong() . Благодаря этому сходству существенно упрощается переход от getoptlong() к popt .
.
Таблица 26.1. Типы аргументов popt
Значение |
Описание |
Тип arg |
POPT_ARG_NONE |
He ожидается ни одного аргумента. |
int |
POPT_ARG_STRING |
Не должна выполняться проверка соответствия типов. |
char * |
POPT_ARG_INT |
Ожидается целочисленный аргумент. |
int |
POPT_ARG_LONG |
Ожидается длинный целочисленный тип. |
long |
POPT_ARG_FLOAT |
Ожидается тип с плавающей точкой. |
float |
POPT_ARG_DOUBLE |
Ожидается тип с плавающей точкой двойной точности. |
double |
POPT_ARG_VAL |
Не ожидается ни одного аргумента (см. текст). |
int |
Следующий элемент, arg
, позволяет библиотеке popt
обновлять переменные в программе автоматически в случае использования параметра. Если arg
имеет значение NULL
, то он будет проигнорирован, и popt
не будет выполнять никаких действий. В противном случае он будет указывать на переменную, тип которой задан в правой колонке табл. 26.1.
Если параметр не принимает аргументов ( argInfo
имеет значение POPT_ARG_NONE
), то переменная, на которую указывает arg
, получает единичное значение при использовании параметра. Если параметр принимает аргумент, то значение переменной, на которую указывает arg
, обновляется до значения аргумента. Аргументы POPT_ARG_STRING
могут принимать любую строку, а аргументы POPT_ARG_INT
, POPT_ARG_LONG
, POPT_ARG_FLOAT
и POPT_ARG_DOUBLE
преобразуются в соответствующий тип, при этом, если преобразование не удастся выполнить, будет сгенерирована ошибка.
Если используется значение POPT_ARG_VAL
, то никаких аргументов не ожидается. Вместо этого popt
скопирует целочисленное значение val
в адрес, на который указывает arg
. Это будет полезно в том случае, когда в программе имеется набор взаимно исключающих аргументов, и выбор падает на последний указанный аргумент. Определяя различные значения val
для каждого параметра, когда член arg
каждого параметра будет указывать на одно и то же целочисленное значение, и, определяя для каждого из них значение POPT_ARG_VAL
, можно легко узнать, какой из этих параметров был определен последним. Если будет задано более одного параметра, то сгенерировать ошибку не удастся.
Член val
устанавливает значение, возвращаемое функцией проверки синтаксиса popt
при обнаружении параметра, если только не используется значение POPT_ARG_VAL
. Если значение будет равно нулю, функция проверки синтаксиса продолжит проверку следующего аргумента командной строки, и не будет возвращать результат.
Читать дальше