Каково значение «:» в функции getopt_long?

#c

Вопрос:

В getopt_long приведенном здесь примере, почему короткие параметры разделены двоеточием abc:d:f: и почему abc они сгруппированы таким образом?

 #include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

/* Flag set by ‘--verbose’. */
static int verbose_flag;

int
main (int argc, char **argv)
{
  int c;

  while (1)
    {
      static struct option long_options[] =
        {
          /* These options set a flag. */
          {"verbose", no_argument,       amp;verbose_flag, 1},
          {"brief",   no_argument,       amp;verbose_flag, 0},
          /* These options don’t set a flag.
             We distinguish them by their indices. */
          {"add",     no_argument,       0, 'a'},
          {"append",  no_argument,       0, 'b'},
          {"delete",  required_argument, 0, 'd'},
          {"create",  required_argument, 0, 'c'},
          {"file",    required_argument, 0, 'f'},
          {0, 0, 0, 0}
        };
      /* getopt_long stores the option index here. */
      int option_index = 0;

      c = getopt_long (argc, argv, "abc:d:f:",
                       long_options, amp;option_index);

      /* Detect the end of the options. */
      if (c == -1)
        break;

      switch (c)
        {
        case 0:
          /* If this option set a flag, do nothing else now. */
          if (long_options[option_index].flag != 0)
            break;
          printf ("option %s", long_options[option_index].name);
          if (optarg)
            printf (" with arg %s", optarg);
          printf ("n");
          break;

        case 'a':
          puts ("option -an");
          break;

        case 'b':
          puts ("option -bn");
          break;

        case 'c':
          printf ("option -c with value `%s'n", optarg);
          break;

        case 'd':
          printf ("option -d with value `%s'n", optarg);
          break;

        case 'f':
          printf ("option -f with value `%s'n", optarg);
          break;

        case '?':
          /* getopt_long already printed an error message. */
          break;

        default:
          abort ();
        }
    }
 

Комментарии:

1.Извините, но вы ссылаетесь на пример в getopt_long документации? Документация, которая будет содержать ответ на ваш вопрос.

2. Прошу прощения, я неправильно прочитал документацию.

Ответ №1:

На странице GNU говорится, что

За символом параметра в этой строке может следовать двоеточие ( : ), чтобы указать, что он принимает требуемый аргумент.

Например, xy:zq принимает параметры x , y , z , q ; y требуется дополнительный аргумент.

Комментарии:

1. Извините, я неправильно прочитал документ. Для уточнения y требуется дополнительный аргумент означает? Из документа, на который вы ссылались, я понял, что y является обязательным аргументом. Группировка происходит только из-за порядка аргументов в строке.

2. @kovac Например, вы запускаете свое выполнение ./kovac.out -q -x -y "my_req_argument"

3. О, понял. Итак, q и x может быть для установки флага, но y требуется значение. Спасибо!

4. @kovac вы даже можете посмотреть отсюда youtu.be/HeNqqsGxM4k?t=78 как он использует аргумент -x