如果我有一个如下所示的C文件,i
和之间有什么区别j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
如果我有一个如下所示的C文件,i
和之间有什么区别j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
Answers:
i
具有内部链接,因此您不能i
在其他源文件(严格地是翻译单元)中使用该名称来引用同一对象。
j
具有外部链接,因此j
如果extern
在另一个翻译单元中声明该对象,则可以使用它来引用该对象。
i
在模块外部不可见;j
可全局访问。
也就是说,链接到它的另一个模块可以执行
extern int j;
然后能够读取和写入中的值j
。另一个模块无法访问i
,但可以声明它自己的实例,甚至是全局实例,第一个模块不可见。
extern
是保证不造成麻烦,提供一个模块具有符号作为非extern
和公共(分配了它)。早期的Unix实现将具有相同名称的符号合并在一起(很像Fortran通用名称),因此extern
不需要。