gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:34:50 24 4
gpt4 key购买 nike

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

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