可以在另一个文件中使用extern访问静态声明的全局变量吗?

时间:2012-11-05 07:49:14

标签: c static global

如果我用静态声明全局变量,我有一个疑问。

file1.c中

static int a=5;

main()
{
   func();
}

可以使用extern在另一个file2.c中访问吗?

file2.c中

func()
{
   extern int a;
   printf(a);
}

或只有没有静态声明的全局变量可以使用extern访问吗?

3 个答案:

答案 0 :(得分:13)

没有!
static将变量的范围限制为相同的 translation unit static为变量提供了 Internal Linkage ,并且在创建的翻译单元之外无法访问此变量。

如果您需要访问不同文件中的变量,只需删除static关键字。

答案 1 :(得分:4)

没有。 file1.c中的a内部链接命名变量。从不同的翻译单元使用的相同名称将引用不同的变量。这可能还有内部链接,或者它可能(如本例所示)具有外部链接

在同一个文件中,你可以引用一个带有内部链接extern的文件范围变量。

static int a;

int main(void) {
    extern int a; // still has internal linkage
    printf("%d\n", a);
}

答案 2 :(得分:2)

这似乎是对静态的两个含义的误解:

  • 对于全局声明静态意味着对翻译单元的限制,因此静态正好意味着阻止您尝试做什么
  • 对于局部变量static是一个存储类,这意味着该变量在函数调用之间保持其值。对于全局变量(在模块级别,即在函数之外),情况总是如此,因此不需要静态。