静态与全局

时间:2010-02-16 09:52:59

标签: c static global

如果我有一个如下所示的C文件,ij之间有什么区别?

#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}

5 个答案:

答案 0 :(得分:57)

i具有内部链接,因此您无法在其他源文件(严格翻译单元)中使用名称i来引用同一对象。

j具有外部链接,因此如果您在另一个翻译单元中声明j,则可以使用extern来引用此对象。

答案 1 :(得分:19)

在模块外部看不到

i; j可在全球范围内访问。

也就是说,链接到它的另一个模块可以

extern int j;

然后能够在j中读取和写入值。同一个其他模块无法访问i,但可以声明它自己的实例,即使是全局实例 - 第一个模块也看不到它。

答案 2 :(得分:4)

不同之处在于i具有内部链接,j具有外部链接。这意味着您可以从链接的其他文件中访问j,而i仅在声明它的文件中可用。

答案 3 :(得分:3)

i将有静态链接,即该变量只能在当前文件中访问。

j应定义为extern,即

extern int j;

在另一个头文件(.h)中,然后它将具有外部链接,并且可以跨文件访问。

答案 4 :(得分:1)

尽管您将文件作为不同源文件的一部分包含在内,但静态变量/函数的范围仍在同一文件中。

全局变量的范围遍及包含它的文件。要将变量包含在不同的源文件中,我们在变量声明之前使用extern。在这种情况下,不会再为该变量分配内存。

extern用于声明C变量而不定义它。 extern关键字扩展了C变量和C函数的可见性。由于默认情况下函数在整个程序中是可见的,因此在函数声明/定义中不需要使用extern。它的使用是多余的。