Книга: Linux программирование в примерах
2.3.3 3. Сводка возвращаемых значений getopt_long()
2.3.3 3. Сводка возвращаемых значений getopt_long()
Теперь должно быть ясно, что getopt_long()
предоставляет гибкий механизм для разбора опций. В табл. 2.2 приведена сводка всех возможных возвращаемых значений функции и их значение.
Таблица 2.2. Возвращаемые значения getopt_long()
Возвращаемый код | Значение |
---|---|
0 | getopt_long() установила флаг, как указано в таблице длинных опций |
1 | optarg указывает на простой аргумент командной строки |
'?' | Недействительная опция |
' ' | Отсутствующий аргумент опции |
'x' | Символ опции 'x' |
-1 | Конец опций |
Наконец, мы улучшим предыдущий пример кода, показав оператор switch
полностью:
int do_all, do_help, do_verbose; /* флаговые переменные */
char *myfile, *user; /* файл ввода, имя пользователя */
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 },
{ "user" , optional_argument, NULL, 'u'},
{ 0, 0, 0, 0 }
};
...
while((c=getopt_long(argc, argv, ":ahvf:u::W;", longopts, NULL)) != -1) {
switch (c) {
case 'a':
do_all = 1;
break;
case 'f':
myfile = optarg;
break;
case 'h':
do_help = 1;
break;
case 'u':
if (optarg != NULL)
user = optarg;
else
user = "root";
break;
case 'v':
do_verbose = 1;
break;
case 0:
/* getopt_long() установил переменную, просто продолжить */
break;
#if 0
case 1:
/*
* Используйте этот case, если getopt_long() должна
* просмотреть все аргументы. В этом случае добавьте к
* optstring ведущий * символ '-'. Действительный код,
* если он есть, работает здесь.
*/
break;
#endif
case ':': /* отсутствует аргумент опции */
fprintf(stderr, "%s: option '-%c' requires an argumentn",
argv[0], optopt);
break;
case '?':
default: /* недействительная опция */
fprintf(stderr, "%s: option '-%c' is invalid: ignoredn",
argv[0], optopt);
break;
}
}
В своих программах вы можете захотеть сделать для каждого символа опции комментарии, объясняющие их значение. Однако, если вы использовали описательные имена переменных для каждого символа опции, комментарии уже не так нужны. (Сравните do_verbose
и vflag
.)
- Множественное присвоение значений:
- 2.3. Разбор опций: getopt() и getopt_long()
- 2.1.3. Функция getopt_long()
- Установка значений спин-счетчиков
- Создание подстановки из фиксированного набора значений
- 19.2.4. Чтение и запись значений элементов HTML-форм
- 19.2.1. Чтение и запись значений HTML-атрибутов
- Follow Along
- 5.2.1. long long
- 2.3.2. GNU getopt() и порядок опций
- 2.3.3.4. GNU getopt() или getopt_long() в программах пользователей
- 9.4.3.5. Сводка fcntl()