如果我有一个如下所示的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不需要。