Я сделаю это в обратном порядке:
static struct option long_options[]
используется для опции переменная объявляется один раз и навсегда, независимо, сколько раз будет выполняться цикл while
.
Но вы должны увидеть его в целом (извлеченную из вашей ссылки):
...
while (1)
{
...
static struct option long_options[] =
{
/* These options set a flag. */
{"verbose", no_argument, &verbose_flag, 1}, // <-- IMPORTANT HERE !
{"brief", no_argument, &verbose_flag, 0}, // <-- IMPORTANT HERE !
/* 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}
};
...
}
...
И, в качестве ссылки декларации переменной, в данном случае verbose_flag
, она должна быть доступна в течение итераций, в противном случае вам потеряет переменную на следующей итерации, а затем ссылается на то, что больше не существует, это будет неопределенное поведение. Вот почему verbose_flag
является глобальным для файла. Он сделан статическим, чтобы гарантировать, что переменная используется только из этого файла, а не из другого.
Это только покрывает 'verbose_flag', обратите внимание, что' long_options' немного отличается ... – hyde