看看下面的代码片段。。。
文件1.h
void somefunc(int);
File1.c
#include "File1.h"
extern int var;
void somefunc(int x)
{
......
var ++;
etc, etc,
....
return;
}
文件2.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未定义"。有人能告诉我这里发生了什么吗。
我只是试图理解静态变量的概念,却遇到了这种困惑。如有任何帮助,我们将不胜感激。
静态int-var;
这在File2.c翻译单元中为var
提供了内部链接,不管后面可能有什么(是的,即使后面有extern
声明)。
因此,如果看到的第一个声明是static int var
,那么在该翻译单元中,var
将永远是内部的,因此其他翻译单元无法访问。
6.2.2-4
对于使用存储类规范
extern
声明的标识符[File1.h
]如果之前的声明是可见的[文件2.h]指定内部或外部链接[它指定内部],标识符的链接位于>后面的声明与先前声明。
它不能是静态的。静态意味着它的"可见性"(不是官方术语,但可能更容易理解)仅限于它出现的C源文件(在本例中,即File2.c
)。
这意味着,当您尝试将File1
和File2
链接在一起时,链接器将无法在File2
中看到var
,这就是您收到错误的原因。
如果您想从File1.c
访问它,请放弃"静态"位。事实上,由于已经在File2.c
中定义了var
,因此从File2.h
中去掉整行。