4

我怀疑我是否用静态声明了全局变量。

文件1.c

static int a=5;

main()
{
   func();
}

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

文件2.c

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

还是只能使用 extern 访问没有静态声明的全局变量?

4

3 回答 3

13

不!
static将变量的范围限制为相同的翻译单元
static给变量一个内部链接,并且这个变量不能在创建的翻译单元之外访问。

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

于 2012-11-05T07:50:37.110 回答
4

没有。file1.c 中的Aa内部链接命名一个变量。来自不同翻译单元的相同名称将引用不同的变量。这也可能有内部链接,或者它可能(如在本例中)有外部链接

但是,在同一个文件中,您可以通过内部链接引用文件范围变量extern

static int a;

int main(void) {
    extern int a; // still has internal linkage
    printf("%d\n", a);
}
于 2012-11-05T07:52:08.970 回答
2

这似乎是对static的两种含义的误解:

  • 对于全局声明,静态意味着对翻译单元的限制,因此静态正是为了防止您尝试做的事情
  • 对于局部变量 static 是一个存储类,这意味着变量在函数调用之间保持其值。对于全局变量(在模块级别,即在函数之外),情况总是如此,因此不需要静态。
于 2012-11-05T07:56:44.543 回答