Skip to content

Home Программирование Использование длинных опций
Использование длинных опций

Функция getopt_long (), объявленная в заголовочном файле getopt.h, позволяет обрабатывать не только короткие, но и длинные (многосимвольные) опции. Следует заметить, что getopt_long () устанавливает правило, по которому длинным опциям предшествует последовательность из двух дефисов (—version, —line-number и т. Д.). Итак, функция getopt_long() имеет следующий прототип:

int getopt_long  (int ARGC,   char ** ARGV,
const char * SHORT_OPTS,
const struct option * LONG_OPTS,
int * OPT_INDEX);

Аргументы argc, argv и short_opts аналогичны соответствующим аргументам функции getopto из предыдущего раздела. long_opts — это массив структур option, описывающий длинные опции и соответствующие им короткие опции. По адресу, находящемуся в opt_index, располагается индекс текущей опции в массиве long_opts. Структура option состоит из четырех элементов:

struct option 
{
char * LONG_OPT;
int WITH_ARG;
int * OPT_FLAG;
int SHORT_OPT;
};

Строка long_opt содержит имя длинной опции (без дефисов). Элемент with_arg может принимать три значения:

  • 0 или no_argument — если опция является флагом, т. е. не требует наличия зависимого аргумента;
  • 1 или required_argument — если опция требует наличия зависимого аргумента;
  • 2 или optionai_argument — если зависимый аргумент предполагается, но не является обязательным.

Указатель opt_flag необходим для работы с опциями, не требующими аргументов, В рамках данной книги мы не будем использовать этот элемент. Если opt_flag установлен в null, то в short_.opt заносится код символа соответствующей короткой опции.

Последний элемент массива long_opts должен содержать только нулевые значения:

LONG_OPT = NULL; 
WITH_ARG = 0; OPT_FLAG = NULL;
SHORT_OPT = 0;

Если в каждом элементе массива long_opts устанавливать opt„flag в null, то функция getopt_long () будет работать так же, как и getopt (). Указатель opt_flag позволяет задействовать расширенные возможности getopt_iong(), описание которых выходит за рамки данной книги.

Рассмотрим в качестве примера программу из предыдущего раздела, добавив в нее возможность обработки длинных опций. Для этого определим следующие соответствия между длинными и короткими опциями:

  • длинная опция --help будет аналогична короткой -h;
  • длинная опция --output будет аналогична короткой -о.

 

Программа longoptdemo.с

#include <stdio.h> 
#include <getopt.h>
int main (int argc, char ** argv)
{
FILE * outfile = stdout;
int i, opt;
char * filename = NULL;
char help_str[] ="Usage: longoptderao [OPTIONS] ARGUMENTS ...\n"
"-h, —help - Print help and exit\n" "-o, —output <outfile> - Write output to file\n",
const struct option long_opts[] = {
{ "help", no_argument, NOLL, 'h' }, { "output", required_argument, NULL, 'o' }, { NULL, 0, NULL, 0 } ;
while {(opt = getopt_long (argc, argv, "ho:",long_opts, NULL}) != -1) { switch (opt) {
case 'h':
printf ("%s", help_str);
return 0;
case 'о':
filename = optarg; break;
case '?':
fprintf (stderr, "%s", help_str); return. 1;
default:
fprintf (stderr, "Unknown error\n");
return 1; }
}
if (optind >= argc)
{
fpr int f (s tderr, "No argument(s) found\n%s", help_str);
return 1;
}
if (filename != NULL)
{
outfile = fopen (filename, "w"); if (outfile == NULL)
{
fprintf (stderr, "Cannot open " "output file <%s)\n", filename); return 1;
}
}
for (i = optind; i < argc; i++)
fprintf (outfile, ,"%s\n", argvfi]);
if (outfile != stdout) fclose (outfile);
return 0;
}

Получение дополнительной информации

Дополнительную информацию по этой теме можно получить из следующих источников:

  • man 3 getopt — man-страница функции getopt ();
  • man 3 getoptjong — man-страница функции getopt_iong ();
  • man 3 popt — man-страница библиотеки popt;
  • man 1 getopt — man-страница утилиты getopt;
  • http://www.gnu.org/software/gengetopt/gengetopt.html — обработчик опций Gengetopt;
  • http://www.gnu.org/software/libc/manual/html_node/ArgpJhtraI — обработчик опций Argp.

 

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top