【发布时间】:2011-05-13 11:52:41
【问题描述】:
C中的全局变量默认是static还是extern?
如果全局变量默认为static,则意味着我们可以在单个文件中访问它们,但我们也可以在不同的文件中使用全局变量。
这是否意味着他们默认拥有extern 存储空间?
【问题讨论】:
标签: c static global-variables extern
C中的全局变量默认是static还是extern?
如果全局变量默认为static,则意味着我们可以在单个文件中访问它们,但我们也可以在不同的文件中使用全局变量。
这是否意味着他们默认拥有extern 存储空间?
【问题讨论】:
标签: c static global-variables extern
如果不指定存储类(即extern 或static 关键字),则默认情况下全局变量具有外部链接。来自 C99 标准:
§6.2.2 标识符的链接
3) 如果对象或函数的文件范围标识符的声明包含存储类说明符
static,则该标识符具有内部链接。5) 如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符
extern声明的一样。如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是外部的。
因此,即使您不指定 extern 关键字,其他源文件(所谓的翻译单元)仍然可以访问全局变量,因为它们仍然可以有 extern同一个变量的声明。如果您使用static 关键字指定内部链接,那么即使在另一个源文件中存在相同变量名的extern 声明,它也会引用不同的变量。
【讨论】:
static extern varx 是未定义的行为。一个变量不能同时是static 和extern,它必须是其中之一。
static extern varx;并不是未定义的行为;这是违反约束的。 C11 §6.7.1 Storage classes ¶2:在声明中的声明说明符中最多可以给出一个存储类说明符,但_Thread_local 可能与static 或extern 一起出现。。尝试声明中的“隐式 int”类型还有一个问题——这在当前的千年标准 C 中是不合法的(它被 C99 禁止,尽管一些编译器仍然允许它,除非被催促拒绝它)。
在 C 中,没有初始化程序或任何存储类说明符的全局变量是具有静态存储持续时间和外部链接的变量的暂定定义。
在一个翻译单元中,所有暂定定义和最多一个非暂定定义(例如,来自带有初始化程序的声明)被折叠成一个变量的单个定义。虽然不允许在多个翻译单元中定义同一个变量,但它是允许“公共”变量的常见扩展,即在多个翻译单元中对同一变量的暂定定义。
【讨论】:
C 中的全局变量默认是外部的..(即)它们具有外部链接..
为了限制外部链接,'static'存储类说明符可用于全局变量。如果使用静态说明符,则该变量具有文件范围。您不能使用“extern”将其链接到其他文件中'关键字..
指定“静态”取决于您对程序的使用..
【讨论】: