Обратите внимание, что значение, переданное аргументу
optstring
, не содержит больше '
a
', '
h
'
или '
v
'. Это означает, что соответствующие короткие опции неприемлемы. Чтобы разрешить как длинные, так и короткие опции, вам придется восстановить в
switch
соответствующие
case
из первого примера.
На практике следует писать свои программы так, чтобы у каждой короткой опции была также соответствующая длинная опция. В этом случае проще всего установить в
flag
NULL, а в
val
соответствующий единичный символ.
2.3.3.2. Длинные опции в стиле POSIX
Стандарт POSIX резервирует опцию
– W
для специфических для производителя возможностей. Поэтому по определению
– W
непереносимо между различными системами.
Если за
W
в аргументе
optstring
следует точка с запятой (обратите внимание не двоеточие),
getopt_long
рассматривает
– Wlongopt
так же, как
– -longopt
. Соответственно в предыдущем примере измените вызов следующим образом:
/* getopt_long
установил переменную, просто продолжить */
break;
#if 0
case 1:
/*
* Используйте этот case, если getopt_long должна
* просмотреть все аргументы. В этом случае добавьте к
* optstring ведущий * символ '-'. Действительный код,
* если он есть, работает здесь.
*/
break;
#endif
case ':': /* отсутствует аргумент опции */
fprintf(stderr, "%s: option '-%c' requires an argument\n",
argv[0], optopt);
break;
case '?':
default: /* недействительная опция */
fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",
argv[0], optopt);
break;
}
}
В своих программах вы можете захотеть сделать для каждого символа опции комментарии, объясняющие их значение. Однако, если вы использовали описательные имена переменных для каждого символа опции, комментарии уже не так нужны. (Сравните
do_verbose
и
vflag
.)
2.3.3.4. GNU
getopt
или
getopt_long
в программах пользователей
Вы можете захотеть использовать в своих программах GNU
getopt
или
getopt_long
и заставить их работать на не-Linux системах/ Это нормально; просто скопируйте исходные файлы из программы GNU или из CVS архива библиотеки С GNU (GLIBC) [30] . Исходные файлы
getopt.h
,
getopt.с
и
getopt1.c
. Они лицензированы на условиях меньшей общедоступной лицензии (Lesser General Public License) GNU, которая позволяет включать библиотечные функции даже в патентованные программы. Вы должны включить в свою программу копию файла