C中的全局变量是静态的还是不是?

时间:2010-11-21 19:28:30

标签: c static global-variables extern

默认情况下,全局变量是否为C staticextern? 如果全局变量默认为static,则表示我们可以在单个文件中访问它们,但我们也可以在不同的文件中使用全局变量。
这是否意味着他们默认存储extern

3 个答案:

答案 0 :(得分:31)

如果您未指定存储类(即externstatic关键字),则默认情况下全局变量具有外部链接。从C99标准:

  

§6.2.2标识符的链接

     

3)如果对象或函数的文件范围标识符的声明包含存储类说明符static,则标识符具有内部链接。

     

5)如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符extern声明的完全相同。如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。

因此,即使您没有指定extern关键字,其他源文件(所谓的翻译单元)仍然可以访问全局变量,因为它们仍然可以拥有{ {1}}声明同一个变量。如果使用extern关键字指定内部链接,那么即使在另一个源文件中存在相同变量名的static声明,它也会引用另一个变量。

答案 1 :(得分:7)

在C中,没有初始化程序或任何存储类说明符的全局变量是具有静态存储持续时间外部链接的变量的暂定定义。

在翻译单元中,所有暂定定义和最多一个非暂定定义(例如来自具有初始化程序的声明)都折叠为变量的单个定义。虽然不允许在多个翻译单元中定义相同的变量,但它是允许“共同”变量的常见扩展,即在多个翻译单元中对同一变量的暂定定义。

答案 2 :(得分:3)

C中的全局变量默认为extern ..(即)它们具有外部链接..

要限制外部链接,'static'存储类说明符可用于全局变量..如果使用静态说明符,则变量具有文件范围..您不能使用'extern将其链接到其他文件中'keyword ..

指定'static'取决于您对程序的使用情况..