【发布时间】:2016-05-16 19:13:10
【问题描述】:
我发现extern 和static(内部)变量的一些行为我觉得很奇怪。
这是一个例子:
/* file a.c */
#include <stdio.h>
/* variable with static linkage */
static int x = 24;
int f() {
/* variable with extern linkage */
extern int x;
return x;
}
int main() {
printf("%d\n", f());
return 0;
}
-
/* file x.c */
/* define symbol `x` to be an `int` equal to 100 */
int x = 100;
我编译这个程序使用:
$ cc a.c x.c -o a
然后我运行我的程序并得到这个输出:
$ ./a
24
为什么这个程序输出的是24而不是100?
【问题讨论】:
-
"static" 不是链接。链接是“外部”、“内部”和“无”。
-
这可能与链接器的工作方式有关。链接器总是先在当前编译单元中搜索给定标识符的定义,然后再在其他编译单元中搜索。例如,您还可以在代码中重新定义一些
C库函数并使用它们来代替标准函数。 -
并不是说这个问题完全是对那个问题的欺骗,但是其中的一个答案在标准中详尽无遗,我相信它可以解释您在此过程中观察到的行为。
-
一句话概括。本地范围掩盖全局范围。
标签: c static linker external symbols