[英]Weird behavior with extern and static linkage of variables
我发现一些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
?
引用链接
下表列出了分配给在单个转换单元中声明两次的对象的链接。 列指定第一个声明,行指定重新声明。
同样来自标准第6.2.2节:
对于在可见该标识符的先前声明的范围内用存储类说明符extern声明的标识符,如果该先前声明指定了内部或外部链接,则该标识符在后面的声明中的链接与该链接相同在事先声明中指定。 如果没有在先声明可见,或者在先声明没有指定链接,则标识符具有外部链接。
因此,文件ac
在内部解决了所有外部链接。 您的代码先将x
定义为静态,然后将其定义为转换单元ac中的外部。因此,上表中的链接是内部的。 因此它打印24
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.