C-静态变量屏蔽全局变量

C-静态变量屏蔽全局变量,c,global-variables,static-variables,C,Global Variables,Static Variables,请看下面的代码片段 文件1.h void somefunc(int); 文件1.c #include "File1.h" extern int var; void somefunc(int x) { ...... var ++; etc, etc, .... return; } 文件2.h static int var; void someotherfunc(int); 文件2.c #include "File2.h" #include "File1.h

请看下面的代码片段

文件1.h

void somefunc(int);
文件1.c

#include "File1.h"

extern int var;

void somefunc(int x)
{
   ......
   var ++;
   etc, etc,
   ....
   return;
}
文件2.h

static int var;

void someotherfunc(int);
文件2.c

#include "File2.h"
#include "File1.h"

int var;

void someotherfunc(int z)
{
   z = etc etc;
   var --;
   ......
   somefunc(z);
   .....
   return;
}
以上四个文件编译没有任何问题。 当我尝试初始化变量“var”时,问题就出现了。 如果'var'在File2.c中初始化,其中它是一个全局变量,那么代码编译时不会出现任何问题。但是,当我尝试初始化File2.h中的静态变量时,编译器抛出一个错误,称“File1.c中的变量'var'未定义”。有人能告诉我这里发生了什么事吗

我只是想理解静态变量的概念,却遇到了这种困惑。任何帮助都将不胜感激

静态int-var

这将在File2.c翻译单元中提供
var
内部链接,不管后面会发生什么(是的,即使后面有
extern
声明)

因此,如果看到的第一个声明是
static int var
,那么在该翻译单元中
var
将永远是内部的,因此其他翻译单元无法访问

6.2.2-4

对于使用存储类规范声明的标识符
extern
[
File1.h
]在先前声明 如果先前的声明 指定内部或外部链接[它指定内部],后面声明中标识的链接与 先前声明

静态int-var

这将在File2.c翻译单元中提供
var
内部链接,不管后面会发生什么(是的,即使后面有
extern
声明)

因此,如果看到的第一个声明是
static int var
,那么在该翻译单元中
var
将永远是内部的,因此其他翻译单元无法访问

6.2.2-4

对于使用存储类规范声明的标识符
extern
[
File1.h
]在先前声明 如果先前的声明 指定内部或外部链接[它指定内部],后面声明中标识的链接与 先前声明


它不可能是静态的。静态意味着它的“可见性”(不是官方术语,但可能更容易理解)仅限于它出现在其中的C源文件(在本例中是
File2.C

这意味着,当您尝试将
File1
File2
链接在一起时,链接器将无法在
File2
中看到
var
,这就是您出现错误的原因


如果您想从
File1.c
访问它,请去掉“静态”位。事实上,由于您已经在
File2.c
中定义了
var
,因此从
File2.h

中删除整行内容,它不能是静态的。静态意味着它的“可见性”(不是官方术语,但可能更容易理解)仅限于它出现在其中的C源文件(在本例中是
File2.C

这意味着,当您尝试将
File1
File2
链接在一起时,链接器将无法在
File2
中看到
var
,这就是您出现错误的原因


如果您想从
File1.c
访问它,请去掉“静态”位。事实上,既然您已经在
File2.c
中定义了
var
,那么从
File2.h

中删除整行代码,为什么要在头文件中执行“static int var;”?这将为包含此头文件的每个.c文件创建一个静态副本。头文件由多个文件包含,因此违反了单一定义规则。“您可以任意多次声明任何内容,但只能定义一次。”这不对,是吗
File2.h
(具有该定义的文件)仅包含一次。或者您是在谈论您在该标题和
File2.c
中定义var的事实吗?是的,完全正确。。。var在File2.c和.h中都有定义。。。我知道没有必要。。但是,我不是在这里寻找对错,我想知道代码中发生了什么。为什么要在头文件中执行“static int var;”?这将为包含此头文件的每个.c文件创建一个静态副本。头文件由多个文件包含,因此违反了单一定义规则。“您可以任意多次声明任何内容,但只能定义一次。”这不对,是吗
File2.h
(具有该定义的文件)仅包含一次。或者您是在谈论您在该标题和
File2.c
中定义var的事实吗?是的,完全正确。。。var在File2.c和.h中都有定义。。。我知道没有必要。。但是,我不是在这里寻找对错,我想知道代码中发生了什么。谢谢!:)我完全明白你想告诉我什么。是的,静态文件使“var”的可见性在File2.c内部。但这里发生的事情是,为'var'分配了两个独立的内存空间。一个用于静态变量,一个用于全局变量,程序执行也是正确的。但是,一旦我将File2.h中的静态变量赋值为static int var=2;编译器然后抛出一个错误,说“File1.c中的var未定义”。我想知道这里到底发生了什么,为什么?谢谢!:)我完全明白你想告诉我什么。是的,静态文件使“var”的可见性在File2.c内部。但这里发生的事情是,为'var'分配了两个独立的内存空间。一个用于静态变量,一个用于全局变量,程序执行也是正确的。但一旦我做了一个a