理解C语言中的静态存储类

20 浏览
0 Comments

理解C语言中的静态存储类

static是全局变量默认的存储类。下面的两个变量(CountRoad)都具有static存储类。\n

static int Count;
int Road;
int main()
{
    printf("%d\n", Road);
    return 0;
}

\n我的问题是:如果默认情况下全局变量是static(这意味着我们将全局变量的作用域限制在该特定的.c文件中),那么我们如何在另一个文件中使用extern这些变量?\n这个问题对于你们很多人来说可能很基础,但我真的很困惑,想要学习正确的细节。

0
0 Comments

在C语言中,变量可以具有不同的存储类别,其中之一是静态存储类。静态存储类用于限制变量的作用域和可见性。在给定的代码中,变量Count具有静态存储类,这意味着它只能在当前源文件中通过名称进行访问。这种变量被称为具有内部链接。相反,变量Road可以从其他源文件中访问,只要这些文件包含了类似于"extern int Road;"的语句。这种变量被称为具有外部链接。通常,人们将Count称为静态变量,将Road称为全局变量。

有人可能会问,默认的存储类别是什么?实际上,在标准C中并没有定义"全局变量"这个术语。然而,大多数人认为具有外部链接的变量就是全局变量,它们的存储类别是extern。

通过了解静态存储类和外部链接的概念,我们可以更好地理解C语言中变量的作用域和可见性。静态存储类可以限制变量的作用域,使其只在当前源文件中可见。而具有外部链接的变量可以在多个源文件中共享和访问。

有关更多关于静态存储类和外部链接的信息,可以参考What are extern variables in C?

0
0 Comments

在C语言中,存储类别说明符(storage-class specifiers)如externstaticregister等被称为存储类别(storage duration)和链接(linkage)。在你的问题中,你似乎混淆了这两个无关的概念:存储类别和链接。实际上,链接描述了对象的外部可见性。

在文件范围内定义的所有变量都具有静态存储类别(无论你是否在声明中使用了static关键字)。这意味着它们永远存在,但并不表示它们的外部可见性。与此同时,使用static关键字定义的变量具有内部链接,而没有任何关键字或使用extern关键字定义的变量具有外部链接。

在你的例子中,变量Road具有静态存储类别和外部链接,这就是为什么你可以直接从其他翻译单元访问它。变量Count具有静态存储类别和内部链接,这就是为什么你不能直接从其他翻译单元访问它。

如果你在没有存储类别说明符的情况下声明一个变量(如你的例子中的Road),它将被视为所谓的“暂定定义”,最终解析为具有静态存储类别和外部链接的变量(在你的例子中)。因此,从这个角度来看,可以说文件范围变量的默认(隐含的)存储类别说明符实际上是extern,而不是static

如果C语言“没有存储类别这个术语”,那么这个答案就不正确。

抱歉我混淆了。你在原问题下的评论是正确的,从某种意义上说,没有存储类别说明符声明的变量的行为就像使用了extern存储类别说明符声明的变量(当然,当我们考虑到暂定定义时,情况会变得更加复杂,但那是另外一个故事了)。

0