C语言中带static关键字的内部链接

C语言中带static关键字的内部链接,c,static,linkage,C,Static,Linkage,我知道在C语言中,static是一个重载的关键字。在这里,我只对它作为一个关键字来执行内部链接感兴趣 如果在.c文件中声明了一个全局变量,那么使用static和不使用static有什么区别?无论哪种方式,都没有其他.c文件可以访问该变量,因此该变量基本上是文件的“私有”变量,无论是否使用static关键字 例如,如果我有一个文件foo.c,并且我声明了一个全局变量: intx=5 该变量x仅对foo.c内部的代码可用(当然,除非我在某个共享头文件中使用extern关键字声明它)。但是如果我没有在

我知道在C语言中,
static
是一个重载的关键字。在这里,我只对它作为一个关键字来执行内部链接感兴趣

如果在
.c
文件中声明了一个全局变量,那么使用
static
和不使用
static
有什么区别?无论哪种方式,都没有其他
.c
文件可以访问该变量,因此该变量基本上是文件的“私有”变量,无论是否使用static关键字

例如,如果我有一个文件
foo.c
,并且我声明了一个全局变量:

intx=5

该变量
x
仅对
foo.c
内部的代码可用(当然,除非我在某个共享头文件中使用
extern
关键字声明它)。但是如果我没有在头文件中声明它,那么如果我键入:

静态int x=5

无论哪种方式,似乎
x
在这里有内部链接。因此,我对
static
在这方面的用途感到困惑。

可以说,在C中只有一个“名称空间”。如果没有“static”关键字,您就不会受到使用名称“x”的另一个文件的保护(即使您没有使它在自己的库头中可见)

尝试将包含非静态变量
x
的几个C文件链接在一起(从每个文件中的函数交错读取和写入访问),并与这些变量声明为静态的情况进行比较

如果在
.c
文件中声明了一个全局变量,那么使用
static
和不使用
static
有什么区别?无论哪种方式,都没有其他
.c
文件可以访问变量[…]

另一个文件可以声明
x

extern int x;
这将允许编译代码引用
x
,然后链接器将很高兴地将这些引用链接到它找到的任何
x


static
通过防止
x
在其翻译单元外部可见来防止这种情况

你几乎回答了自己的问题——你说“如果我不在头文件中声明它”,意思是“如果我不使用
extern
关键字编写声明”。关键是,如果你已经声明了你的变量是静态的,那么写这样的声明是不可能的,而如果你没有声明,其他人可能会来做,链接到你的代码,并访问你的变量。(以及Pascal Cuoq提到的)可能的重复。我在回答中特别提到了这个问题:这很有趣。在数据封装没有得到广泛实践或鼓励的时候,这难道不是一个很有先见之明的特性吗?换句话说,global允许跨文件的多个声明使用“extern”共享一个单一的定义,而static不会。是吗?@Channel72:这就是为什么全球数据不受欢迎的原因:它不是封装的。如果是的话,就不是全球数据了。@naivnomore:你一直都在这样做。只有您将声明放入头文件,并包含来自其他翻译单元的声明。(对于函数声明,您省略了
extern
,因为它们隐式地是
extern
)对于编译器来说,(预处理后)这些声明实际上来自何处并不重要。@Channel72,它并没有先见之明,而是提供了当时的汇编程序已经提供的功能。当然,如果这些文件都没有初始化全局x,您可能会得到一个公共块。。。。即使您的各种
x
的类型不同。感谢您需要在链接器中支持FORTRAN,我的意思是“是的,没有初始化”。想知道我们在谈论什么的读者可以访问。