【问题标题】:Why static global variable is accessible in other file?为什么静态全局变量可以在其他文件中访问?
【发布时间】:2021-02-25 14:50:45
【问题描述】:
//a.c
#include <stdio.h>
#include "b.c"
void main()
{
int var;
var = increment();
var = increment();
var = increment();
count = count + 3;
var = count;
printf("%d", var);
}
//b.c
static int count;
int increment()
{
++count;
return count;
}
现在就像在 b.c 文件中一样,我有一个名称为 count 的变量并且是静态的。现在这个变量不应该直接在 a.c 中访问,但在我的情况下,我可以访问和操作它。所以我错过了什么吗?
OUTPUT
6
【问题讨论】:
标签:
c
variables
scope
static
global-variables
【解决方案1】:
a.c中的#include "b.c"使b.c成为a.c编译的一部分;它们被编译为一个源文件。
为了将不同源文件中的标识符分开,您需要分别编译它们,而不是使用#include 将其中一个包含在另一个中。单独的编译生成单独的目标文件(Unix 和类 Unix 系统上的.o 文件),然后您使用链接命令(可能包含在 gcc 命令中或由其执行)将它们链接在一起。
分离源文件也分离了一个你想在两个文件之间共享的标识符,这个函数名为increment。所以a.c 不会知道increment,编译器会抱怨。要为单个函数处理此问题,您可以简单地在 a.c 中使用 extern int increment(); 声明该函数。但是,管理这种标识符共享的常用技术是:
- 创建一个名为
b.h 的文件,该文件声明要在 b.c 中定义但与其他源文件共享的标识符。
- 在
b.h 中,用extern int increment(); 声明increment。
- 在将使用来自
b.c 的标识符的任何源文件中,将b.h 包含在#include "b.h" 中。
- 在
b.c 中,还包括b.h。这可以检查b.h 中的声明是否与b.c 中的定义相匹配,因为编译器会在编译b.c 时看到这两者并报告不一致。
【解决方案2】:
您已将 b.c 包含在 a.c 中,因此就编译器而言,它们成为一个单独的单元。因此,您可以看到静态变量。
如果您删除了包含行,您将看不到 count 或 increment,尽管后者会被隐式声明,因为它是一个函数。