c-为什么静态全局变量可以在其他文件中访问


//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
a.c中的#include "b.c"使b.c成为a.c编译的一部分;它们被编译为一个源文件。

要使单独源文件中的标识符保持独立,可以单独编译它们,而不使用#include将一个标识符包含在另一个文件中。单独的编译生成单独的对象文件(Unix和类Unix系统上的.o文件(,然后使用链接命令将其链接在一起(该命令可能包含在gcc命令中或由其执行(。

分离源文件还可以分离您希望在两个文件之间共享的标识符,即名为increment的函数。所以a.c不会知道increment,编译器会抱怨。要为单个函数处理此问题,您可以简单地用extern int increment();声明a.c中的函数。然而,管理这种标识符共享的常用技术是:

  • 创建一个名为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时会同时看到这两个声明,并报告不一致

您已经将b.c包含在a.c中,因此就编译器而言,它们成为一个单独的单元。因此,您可以看到静态变量。

如果删除include行,则不会看到countincrement,尽管后者将被隐式声明,因为它是一个函数。

相关内容

  • 没有找到相关文章

最新更新