C中的全局变量是静态的还是不是?
默认情况下,C static
或extern
是全局变量吗?
如果全局变量默认是静态的,那么它意味着我们可以在单个文件中访问它们,但我们也可以在不同的文件中使用全局变量。
这是否意味着默认情况下它们具有外部存储?
如果未指定存储类(即extern
或static
关键字),则默认情况下全局变量具有外部链接。 从C99标准:
§6.2.2标识符的链接
3)如果对象或函数的文件范围标识符的声明包含
static
的存储类说明符,则标识符具有内部链接。5)如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符
extern
声明的链接完全相同。 如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。
因此,即使您没有指定extern
关键字,仍然可以通过其他源文件(所谓的翻译单元 )访问全局变量,因为它们仍然可以对同一变量进行extern
声明。 如果使用static
关键字指定内部链接,那么即使在另一个源文件中存在相同变量名的extern
声明,它也会引用另一个变量。
在C中,没有初始化器或任何存储类说明符的全局变量是具有静态存储持续时间和外部链接的变量的暂定定义。
在翻译单元中,所有暂定定义和最多一个非暂定定义(例如,来自具有初始化器的声明)被折叠成变量的单个定义。 虽然不允许在多个翻译单元中定义相同的变量,但它是允许“共同”变量的常见扩展,即在多个翻译单元中对同一变量的暂定定义。
C中的全局变量默认为extern ..(即)它们具有外部链接..
要限制外部链接,可以将“静态”存储类说明符用于全局变量。如果使用静态说明符,则变量具有文件范围。您不能使用“extern”关键字将其链接到其他文件中。 。
指定’static’取决于您对程序的使用情况..