2011-08-12 67 views
1

我已经阅读过某处,我们可以通过在变量名前使用static关键字,将全局变量的范围限制为只有 。但是,当我试图实际上它出来是假的:我们真的可以使用Static来限制全局变量的范围吗?

//1st file - file1.c     //2nd file - file2.h 
#include<file2.h>      static int a; 
main()         
{ 
    fun();         
}                     

fun() 
{ 
    printf("%d",a); 
} 

O/P是0

现在我们确实有一个全局变量这是在file2.h宣布,其范围仅限于此文件。
因为我们已经声明它是静态的,但是我们仍然可以在file1.c中访问这个变量。怎么样 ??

+0

你在质疑自己的答案吗? [链接](http://stackoverflow.com/questions/7025934/how-to-declare-a-global-variable-which-is-present-in-only-one-function/7026322#7026322) –

+0

Yaa Cyber​​它的像那样.. –

回答

2

限制全局变量的范围,以一个文件语句,通过文件它们意味着编译单元,即.c文件。 file2.h包含在file1.c中,它们构成一个编译单元file1

将该变量移动到第二编译单元,例如, file2.c,你会发现即使有extern声明你也无法访问它。

+0

这听起来是一个好主意!!但仍然在file2.ci中必须包括file2.h ?? –

+0

将#include视为复制粘贴文件内容。如果在'file1.c'和'file2.c'中都包含'file.h',它们都会声明'a',但它们会是两个不同的变量:更改一个不会改变另一个。 – hamstergene

+0

@Amit Singh Tomar:不会在file2.c中包含file2.h最终创建出现在的相同场景吗? –

0

范围在C预处理器运行后定义。即:所有#include语句已被评估和内联。

1

您正在包含文件file2.h,其中您将该变量声明为具有main的c文件中的静态变量,与在该c文件中编写声明一样好。

当您包含声明静态变量的头文件时,会为其中包含头文件的每个翻译单元(c文件+包含的头文件)创建变量副本。

永远不要在头文件中声明你的静态变量。

要测试的情况下,你应该这样做:

//file1.c 

static int i = 10; 

//file2.c 

extern int i; 

int main() 
{ 
    int a = i; 
    return 0; 
} 
2

范围并不局限于一个文件,但到翻译单元。由于您将file2.h包含到file1.c中,所以这只是一个TU - 您可能已将file2.h的内容粘贴到源文件中。