Ç - 静态变量掩盖全局变量
看一看下面的代码片段...Ç - 静态变量掩盖全局变量
File1.h
void somefunc(int);
FILE1.C
#include "File1.h"
extern int var;
void somefunc(int x)
{
......
var ++;
etc, etc,
....
return;
}
File2.h
static int var;
void someotherfunc(int);
File2.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'未定义'。有人可以告诉这里发生了什么。
我只是想了解静态变量的概念,并且遇到了这种困惑。任何帮助,将不胜感激。
static int var;
这使得在file2.c中翻译单元var
内部连接,无论可能跟随(是的,即使extern
声明如下)。
所以,如果看到的第一个声明是static int var
,在翻译单元var
将永远是内部的,因此无法进入其他翻译单元。
6.2.2-4
对于identi音响ER声明与存储类SPECI音响ER
extern
[File1.h
]在一个范围,其中该 identi音响ER的先前声明是可见[所述一个在File2.h]中,如果事先声明 指定了内部或外部链接[它指定内部],则在后面的声明中,标识符的链接是在 之前的声明指定的联系。
它不能是静态的。静态意味着它的“可见性”(不是官方术语,但可能更容易理解)仅限于它出现的C源文件(在这种情况下,即File2.c
)。
这意味着,当您尝试File1
和File2
连接在一起,连接器将无法看到var
在File2
,这就是为什么你得到错误。
如果您希望可以从File1.c
访问,请将“静态”位丢弃。实际上,由于您已在File2.c
中定义了var
,因此请从File2.h
中排除整行。
谢谢!:) 我完全理解你想告诉我什么。是的,静态使File2.c内部的'var'可见。 但是,wat在这里发生的是,两个独立的内存空间被分配给'var'。一个用于静态变量,另一个用于全局变量和程序执行也是正确的。但是,一旦我将File2.h中的静态变量赋值为 static int var = 2;然后编译器会抛出一个错误,提示“File1.c中的var未定义”。我想知道这里究竟发生了什么,为什么? – cbhavi 2012-03-16 08:39:46
你为什么想要做一个“static int var;”在头文件中?这将为每个包含此头文件的.c文件创建一个静态副本。 – Jay 2012-03-13 06:28:35
头文件包含在多个文件中,因此违反了单个定义规则。 “您可以随意多次声明任何内容,但只能定义一次。” – 2012-03-13 06:30:09
这是不对的,是吗? 'File2.h'(带有定义的那个)只包含_once._或者你说的是你在这个头文件和'File2.c'中定义了var的事实? – paxdiablo 2012-03-13 06:33:13