C中与static关键字的内部链接

时间:2010-08-19 19:38:53

标签: c static linkage

我知道static是C中的重载关键字。在这里,我只对将其用作关键字来强制执行内部链接感兴趣。

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

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

int x = 5;

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

会有什么不同

static int x = 5

无论哪种方式,x似乎都有内部联系。所以我对static在这方面的目的感到困惑。

2 个答案:

答案 0 :(得分:12)

  

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

其他文件可以 声明 x

extern int x;

这将允许编译引用x的代码,然后链接器会愉快地将这些引用链接到它找到的任何x

static通过阻止x在其翻译单元之外显示来防止这种情况发生。

答案 1 :(得分:6)

只有一个“命名空间”,可以这么说,在C.没有“static”关键字,你不会使用名称“x”保护其他文件(即使你没有在你自己的库中看到它头)。

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