C 为什么全局静态变量优先于函数中的外部变量?

C 为什么全局静态变量优先于函数中的外部变量?,c,static,extern,C,Static,Extern,这很难在文本中解释,因此我将举一个例子 //f1.c int a = 5; int main() { printf("func2() output is: %i\n", func2() ); return 0; } //f2.c static int a = 3 int func2() { extern int a; return a; } 当我编译并运行它时,我得到了3,而我期望的是5。有人能解释一下为什么我得了3分吗?我本以为在函数中使用extern

这很难在文本中解释,因此我将举一个例子

//f1.c
int a = 5;

int main()
{
    printf("func2() output is: %i\n", func2() );
    return 0;
}


//f2.c
static int a = 3

int func2()
{
    extern int a;
    return a;
}

当我编译并运行它时,我得到了3,而我期望的是5。有人能解释一下为什么我得了3分吗?我本以为在函数中使用extern时,它不会使用静态变量的值。

静态类修饰符表示该变量将仅在该转换单元(
f2.c
)中可见。
extern
对于
a
,您只声明了该变量,但没有定义它。然而,在翻译单元f2.c中有一个
a
,因此将使用这个

对于使用存储类说明符
extern
声明的标识符,在该标识符的先前声明可见的作用域中,如果先前声明指定了内部或外部链接,则后面声明中的标识符链接与先前声明中指定的链接相同。如果之前的声明不可见,或者之前的声明未指定任何链接,则标识符具有外部链接


因此,
extern
在函数范围内意味着默认情况下变量有外部链接,但如果有另一个可见的定义,则使用该定义。

好吧,因为标准就是这样定义的。