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



看看下面的代码片段。。。

文件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)。

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

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

相关内容

  • 没有找到相关文章

最新更新