【问题标题】:Why does a global static variable take precedence over an extern within a function?为什么全局静态变量优先于函数中的外部变量?
【发布时间】:2013-03-27 21:15:04
【问题描述】:

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

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

【问题讨论】:

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

标签: c static extern


【解决方案1】:

来自 n1256 §6.2.2 ¶4:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-29
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      相关资源
      最近更新 更多