c - 为什么我可以访问另一个文件中的静态变量?

标签 c static

我有 2 个文件:

a.c
b.c

a.c:

#include <stdio.h>
#include "b.c"

int main()
{
    printf("%s", B_VAR);
    return 0;
}

b.c:

static char B_VAR[] = "Hello world!\n";

编译并运行:

jonathan:~/code/staticDemo$ gcc a.c -o test
jonathan:~/code/staticDemo$ ./test
Hello world!

我的印象是,静态会使 B_VAR 仅限于 b.c,但这似乎有效。

最佳答案

确实是static关键字使变量仅对单个 C 文件可见。然而,在 a.c包括 b.c这意味着它不是用 a.c 编译和链接的,而是复制到 a.c 中。 .

C 预处理器在包含时将一个文件复制到另一个文件,并且在编译文件之前执行预处理器。

因此,这是要编译的有效代码(使用 -e 标志使用 GCC 生成,并排除 <stdio.h> 定义):

# 2 "a.c" 2
# 1 "./b.c" 1
static char B_VAR[] = "Hello world!\n";
# 3 "a.c" 2

int main()
{
    printf("%s", B_VAR);
    return 0;
}

这意味着 B_VAR可通过 a.c 访问因为它确实a.c中.

如果您单独编译每个并将它们链接在一起以获得最终的可执行文件,B_VAR 无法访问。

示例( -c 表示仅预处理和编译,但不链接):

gcc -c a.c -o a.o (GCC 失败并显示 use of undeclared identifier 'B_VAR' )

gcc -c b.c -o b.o

gcc a.o b.o -o test

./test

希望这有帮助。

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

相关文章:

C- 参数输入

linux - openssh - 从文件中读取

c - 将文件中的 MachineCode 加载到内存中并在 C 中执行——mprotect 失败

php - __callStatic() : instantiating objects from static context?

c - 分配超过需要的

c - 与 cygwin 链接

java - 无法从静态主函数内部调用非静态构造函数

java - 服务层静态对象字段有什么用

python - 带有夹层和模板的 django 静态 url

c# - 是否固定了静态类成员?