2

这很难用文字解释,所以我举个例子。

//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,它不会使用静态变量的值。

4

2 回答 2

1

类修饰符表示该static变量仅在此翻译单元中可见 ( f2.c) 通过使用externfor a,您仅声明了该变量,但未定义它。然而,a在 translation-unit 中有一个可用的f2.c,所以将使用这个。

于 2013-03-27T21:19:12.703 回答
1

从 n1256 §6.2.2 ¶4:

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

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

于 2013-03-27T21:23:46.190 回答