我们真的可以使用Static来限制全局变量的范围吗?

时间:2011-08-12 10:10:03

标签: c static global-variables

我已经在某处读过,我们可以将全局变量的范围仅限制为一个文件 在变量名之前使用static关键字。但是,当我尝试它时,它实际上是错误的:

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

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

O / P为0

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

4 个答案:

答案 0 :(得分:2)

范围不仅限于文件,而是限于翻译单元。由于您将file2.h包含在file1.c中,因此这只是一个TU - 您也可以将file2.h的内容粘贴到源文件中。

答案 1 :(得分:2)

中将全局变量的范围限制为文件语句,文件表示编译单元,即.c文件。 file2.h包含file2.h,它们构成一个编译单元file1

将变量移动到第二个编译单元,例如file2.c,即使使用extern声明,您也会看不到它。

答案 2 :(得分:1)

您在c文件中包含文件file2.h,其中您将变量声明为static,这与在该c文件中编写声明一样好。

如果包含声明静态变量的头文件,则会为包含头文件的每个转换单元(c文件+包含的头文件)创建变量的副本。

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

要测试场景,您应该这样做:

//file1.c 

static int i = 10;

//file2.c

extern int i;

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

答案 3 :(得分:0)

范围是在C的预处理器运行后定义的。即:毕竟已经对#include-statements进行了评估和内联。