如果我有一个如下所示的C文件,i
和j
之间有什么区别?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
答案 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
。它的使用是多余的。