我已经在某处读过,我们可以将全局变量的范围仅限制为一个文件 在变量名之前使用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中访问此变量。怎么??
答案 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进行了评估和内联。