Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';这里静态的目的是什么?_C++_C_Static - Fatal编程技术网

C++ 什么';这里静态的目的是什么?

C++ 什么';这里静态的目的是什么?,c++,c,static,C++,C,Static,在中,static用于文件范围中定义的标志: /* Flag set by ‘--verbose’. */ static int verbose_flag; 在while循环块范围中定义的long\u选项struct中: static struct option long_options[] 此处是否使用了static,以便其他文件无法访问变量?在这两种情况下,静态的使用方式是否相同?在结构中,它是否因为保存在相同的内存位置而没有重新初始化而更有效 如果static用于文件范围中的变量,则表

在中,
static
用于文件范围中定义的标志:

/* Flag set by ‘--verbose’. */
static int verbose_flag;
while
循环块范围中定义的
long\u选项
struct中:

static struct option long_options[]

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

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

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


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

好吧,当C/C++文件中的任何代码块中出现static时,它是一个声明修饰符,表示其他文件无法访问该变量;当static出现在代码块中时,表示该变量为“static”。详细标志适用于前者,而长选项适用于另一个。

我将按相反顺序执行:

static struct option long_options[]
用于一次性声明变量选项,该选项与执行
while
循环的次数无关

但您应该将其视为一个整体(摘自您的链接):

。。。
而(1)
{
...
静态结构选项长_选项[]=
{
/*这些选项设置了一个标志*/

{“verbose”,无参数,&verbose\u标志,1},//与其说是文件,不如说是翻译单元。翻译单元基本上是预处理后剩下的部分,因此它也包含了所有.h文件中的所有代码。而.h文件中的
静态声明在包含该.h文件的每个翻译单元中创建了该内容的独立副本。因此它是不准确的/误导性地说“其他文件无法访问”.@hyde你为什么不写你自己的答案?当然,建议改进是可以的,但是评论对讨论本身并没有帮助。
verbose\u flag
在文件范围内,所以即使没有
static
,它在迭代之间也不会丢失它的值。它是出于不同的原因而创建的
static
。@hyde我正要通信不一样thing@hyde是的,你是对的,那么它是为了使变量完全本地到这个文件,确保没有使用其他文件。
...
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}
    };
...
}
...