在GNU's getopt_long
example中,static
用于文件范围中定义的标志:
/* Flag set by ‘--verbose’. */
static int verbose_flag;
并在long_options
循环块范围中定义的while
结构中:
static struct option long_options[]
这里是否使用static
以便其他文件无法访问变量?在这两种情况下static
是否以相同的方式使用,并且它在结构中更有效,因为它保存在内存的相同位置而不是重新初始化?
答案 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
对文件是全局的原因。它是静态的,以确保变量只能从该文件中使用而不能从另一个文件中使用。