关于C#:静态vs全局

Static vs global

如果我有下面这样的C文件,那么ij有什么区别?

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}


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

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


i在模块外不可见;j可全局访问。

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

1
extern int j;

然后能够读写j中的值。另一个模块不能访问i,但可以声明它自己的实例,甚至是第一个模块看不到的全局实例。


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


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

j应定义为extern,即

1
extern int j;

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


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

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

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