gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:59:07 25 4
gpt4 key购买 nike

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

最佳答案

#include "b.c" in a.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 时同时看到两者并报告不一致。

关于c - 为什么静态全局变量可以在其他文件中访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com