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