理解C中的静态存储类

理解C中的静态存储类,c,C,static是全局变量的默认存储类。下面的两个变量(Count和Road)都具有静态存储类 static int Count; int Road; int main() { printf("%d\n", Road); return 0; } 我的问题是:如果默认情况下全局变量是静态的(这意味着我们将该全局变量的范围限制在特定的.c文件中),那么我们如何在另一个文件中外部这些变量 这个问题对你们中的许多人来说可能是非常基本的,但我真的很困惑,想了解正确的细节。变量Count在这个

static
是全局变量的默认存储类。下面的两个变量(
Count
Road
)都具有
静态
存储类

static int Count;
int Road;
int main()
{
    printf("%d\n", Road);
    return 0;
}
我的问题是:如果默认情况下全局变量是
静态的
(这意味着我们将该全局变量的范围限制在特定的
.c
文件中),那么我们如何在另一个文件中
外部
这些变量


这个问题对你们中的许多人来说可能是非常基本的,但我真的很困惑,想了解正确的细节。

变量
Count
在这个源文件中只能通过名称访问,因为它前面有
静态
。正式地说,它具有内部链接(参见ISO/IEC 9899:2011§6.2.2标识符链接)

变量
Road
可以从其他源文件访问,如果这些文件包含与
extern-int-Road等效的文件作为语句之一。从形式上说,它有外部联系

通常,大多数人会将
Count
称为静态变量,将
Road
称为全局变量


另请参见正式C术语中的,
外部
静态
寄存器
等说明符称为存储类说明符,但这些说明符控制的实际对象属性称为存储持续时间和链接

在您的问题中,您似乎混合了这两个不相关的概念:存储持续时间和链接。实际上,链接描述了对象的外部可见性

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

在您的示例中,变量
Road
具有静态存储持续时间和外部链接,这就是您可以直接从其他翻译单元访问它的原因。变量
Count
具有静态存储持续时间和内部链接,这就是您无法直接从其他翻译单元访问它的原因


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

read(&&&):)您的第一句话是错误的。文件范围中声明的
静态
变量不是全局变量。您的源错误。默认情况下,在文件作用域中声明的变量和函数具有
extern
存储类(尽管这使它们具有静态持续时间)。
static
关键字为它们提供了静态存储类。@hobbs:在文件范围内声明为外部链接和静态存储持续时间的对象。那么全局变量的默认存储类是什么?“全局变量”不是标准C中定义的术语。但是,带有外部链接的变量是大多数人认为的全局变量,因此它们的存储类是
extern
。如果C“没有“存储类”这样的术语,这个答案就不正确了。@hobbs:很抱歉我的混淆。您在原始问题下的评论是正确的,从某种意义上讲,在没有存储类说明符的情况下声明的变量的行为就好像它们是使用
extern
storage class说明符声明的一样(当然,当我们考虑暂定定义时,事情会变得更复杂一些,但这是另一回事)。