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