Книга: 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.)

Оглавление книги


Генерация: 1.522. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз