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
在函数范围内意味着默认情况下变量有外部链接,但如果有另一个可见的定义,则使用该定义。好吧,因为标准就是这样定义的。