Ç - 静态变量掩盖全局变量

问题描述:

看一看下面的代码片段...Ç - 静态变量掩盖全局变量

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'未定义'。有人可以告诉这里发生了什么。

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

+3

你为什么想要做一个“static int var;”在头文件中?这将为每个包含此头文件的.c文件创建一个静态副本。 – Jay 2012-03-13 06:28:35

+1

头文件包含在多个文件中,因此违反了单个定义规则。 “您可以随意多次声明任何内容,但只能定义一次。” – 2012-03-13 06:30:09

+0

这是不对的,是吗? 'File2.h'(带有定义的那个)只包含_once._或者你说的是你在这个头文件和'File2.c'中定义了var的事实? – paxdiablo 2012-03-13 06:33:13

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

这意味着,当您尝试File1File2连接在一起,连接器将无法看到varFile2,这就是为什么你得到错误。

如果您希望可以从File1.c访问,请将“静态”位丢弃。实际上,由于您已在File2.c中定义了var,因此请从File2.h中排除整行。

+0

谢谢!:) 我完全理解你想告诉我什么。是的,静态使File2.c内部的'var'可见。 但是,wat在这里发生的是,两个独立的内存空间被分配给'var'。一个用于静态变量,另一个用于全局变量和程序执行也是正确的。但是,一旦我将File2.h中的静态变量赋值为 static int var = 2;然后编译器会抛出一个错误,提示“File1.c中的var未定义”。我想知道这里究竟发生了什么,为什么? – cbhavi 2012-03-16 08:39:46