C 为什么静态全局变量可以在其他文件中访问?
现在,正如在b.c文件中一样,我有一个名为count的变量,它是静态的。现在这个变量不应该在a.c中直接访问,但在我的情况下,我可以访问和操作它。我是不是错过了什么C 为什么静态全局变量可以在其他文件中访问?,c,variables,scope,static,global-variables,C,Variables,Scope,Static,Global Variables,现在,正如在b.c文件中一样,我有一个名为count的变量,它是静态的。现在这个变量不应该在a.c中直接访问,但在我的情况下,我可以访问和操作它。我是不是错过了什么 //b.c static int count; int increment() { ++count; return count; } 您已经将b.c包含在a.c中,因此就编译器而言,它们成为一个单独的单元。因此,您可以看到静态变量 如果删除include行,您将看不到count或increment,尽管后者将被隐式
//b.c
static int count;
int increment()
{
++count;
return count;
}
您已经将b.c包含在a.c中,因此就编译器而言,它们成为一个单独的单元。因此,您可以看到静态变量 如果删除include行,您将看不到
count
或increment
,尽管后者将被隐式声明,因为它是一个函数。在a.c
中包含“b.c”
使b.c
成为a.c
编译的一部分;它们被编译为一个源文件
要使单独的源文件中的标识符保持独立,可以单独编译它们,而无需使用#include
将一个标识符包含在另一个源文件中。单独的编译生成单独的目标文件(.o
Unix和类似Unix的系统上的文件),然后使用link命令将其链接在一起(该命令可能包含在gcc
命令中或由该命令执行)
分离源文件还会分离您希望在两个文件之间共享的标识符,即名为increment
的函数。因此a.c
将不知道increment
,编译器会抱怨。要针对单个函数处理此问题,只需使用extern int increment()在a.c
中声明函数即可代码>。然而,管理标识符共享的常用技术是:
- 创建名为
b.h
的文件,该文件声明要在b.c
中定义但与其他源文件共享的标识符
- 在
b.h
中,使用extern int increment()声明increment
代码>
- 在将使用
b.c
中标识符的任何源文件中,包括b.h
和#包括“b.h”
- 在
b.c
中,还包括b.h
。这将检查b.h
中的声明是否与b.c
中的定义匹配,因为编译器在编译b.c
时会同时看到这两个声明并报告不一致
//b.c
static int count;
int increment()
{
++count;
return count;
}
OUTPUT
6