C-静态变量屏蔽全局变量
请看下面的代码片段 文件1.hC-静态变量屏蔽全局变量,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
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