具有变量外部和静态链接的怪异行为

wef*_*fa3 2 c linker static symbols external

我发现一些与externstatic(内部)变量有关的行为,我觉得很奇怪。

这是一个例子:

/* 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;
}
Run Code Online (Sandbox Code Playgroud)

--

/* file x.c */
/* define symbol `x` to be an `int` equal to 100 */
int x = 100;
Run Code Online (Sandbox Code Playgroud)

我使用以下命令编译该程序:

$ cc a.c x.c -o a
Run Code Online (Sandbox Code Playgroud)

然后,我运行程序并获得以下输出:

$ ./a
24
Run Code Online (Sandbox Code Playgroud)

为什么该程序输出24而不是100

Rav*_*ave 5

引用链接

下表列出了分配给在单个转换单元中声明两次的对象的链接。列指定第一个声明,行指定重新声明。

用于解决冲突链接的表

同样来自标准第6.2.2节:

对于在可见该标识符的先前声明的范围内用存储类说明符extern声明的标识符,如果该先前声明指定了内部或外部链接,则该标识符在后面的声明中的链接与该链接相同在事先声明中指定。如果没有在先声明可见,或者在先声明没有指定链接,则标识符具有外部链接。

因此,该文件的a.c所有外部链接都在内部解决。您的代码x首先定义为静态,然后在转换单元ac中定义为外部,因此,链接是上表内部的。因此它打印24