我知道static
是C中的重载关键字。在这里,我只对将其用作关键字来强制执行内部链接感兴趣。
如果您在.c
文件中声明了全局变量,那么使用static
和不使用static
之间有什么区别?无论哪种方式,没有其他.c
文件可以访问该变量,因此该变量基本上是文件的“私有”,有或没有static关键字。
例如,如果我有一个文件foo.c
,并且我声明了一个全局变量:
int x = 5;
该变量x
仅适用于foo.c
内的代码(当然,除非我在使用extern
关键字的某个共享头文件中声明它)。但是如果我没有在头文件中声明它,那么如果我要输入:
static int x = 5
。
无论哪种方式,x
似乎都有内部联系。所以我对static
在这方面的目的感到困惑。
答案 0 :(得分:12)
如果您在
.c
文件中声明了全局变量,那么使用static
和不使用static
之间有什么区别?无论哪种方式,没有其他.c
文件可以访问变量[...]
其他文件可以 声明 x
:
extern int x;
这将允许编译引用x
的代码,然后链接器会愉快地将这些引用链接到它找到的任何x
。
static
通过阻止x
在其翻译单元之外显示来防止这种情况发生。
答案 1 :(得分:6)
只有一个“命名空间”,可以这么说,在C.没有“static”关键字,你不会使用名称“x”保护其他文件(即使你没有在你自己的库中看到它头)。
尝试将包含非静态变量x
的几个C文件链接在一起(对每个文件中的函数进行交错读写访问),并将这些变量声明为静态的情况进行比较。