这里静态的目的是什么?

时间:2016-04-06 06:24:07

标签: c++ c static

GNU's getopt_long example中,static用于文件范围中定义的标志:

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

并在long_options循环块范围中定义的while结构中:

static struct option long_options[]

这里是否使用static以便其他文件无法访问变量?在这两种情况下static是否以相同的方式使用,并且它在结构中更有效,因为它保存在内存的相同位置而不是重新初始化?

3 个答案:

答案 0 :(得分:2)

如果static用于文件范围中的变量,则表示它对于该文件是本地的。如果没有该关键字,您可以在另一个包含extern关键字的文件中使用它。

这同样适用于功能。如果C中的函数在文件中是静态的,则只能在该文件中使用,而不能在其他文件中使用。

所以是的,我想是为了防止在其他文件中使用它。

答案 1 :(得分:0)

好吧,当静态出现在C / C ++文件中的任何代码块之外时,它的声明修饰符表明该变量不能被其他文件访问;当静态出现在代码块中时,它说这个变量是"静态"。 verbose_flag适合前者,而long_options适合另一个。

答案 2 :(得分:0)

我会按相反的顺序进行:

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对文件是全局的原因。它是静态的,以确保变量只能从该文件中使用而不能从另一个文件中使用。