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文件中一样,我有一个名为count的变量,它是静态的。现在这个变量不应该在a.c中直接访问,但在我的情况下,我可以访问和操作它。我是不是错过了什么

//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