c中静态变量的范围

时间:2020-02-03 15:02:09

标签: c static global-variables extern

我正在读k&r书。在4.6节中,它说:应用于外部变量或函数的静态声明将对象的范围限制为正在编译的源文件的其余部分。在不同源文件中用 extern 关键字编写时,我对静态外部变量的范围感到困惑。

1 个答案:

答案 0 :(得分:3)

在函数外部声明的任何标识符都具有文件范围。该声明仅在当前翻译单元内部可见,该单元是一个源文件以及通过#include预处理指令包含的所有文件。

默认情况下,在文件范围内声明的对象的标识符具有外部链接。这意味着,如果在单独的翻译单元中声明了相同的标识符,则它引用的是同一对象。 (对象是可以表示值的存储区域。您认为变量是其名称,标识符和用于它是 object 。)

当对象的声明包含static时,标识符具有内部链接。这意味着同一翻译单元中具有内部链接的其他声明将引用同一对象,而另一翻译单元中的声明将引用同一对象。

请注意,出于历史原因,静态外部具有多种含义和作用。函数外的所有声明(包括函数的声明)都是C标准语言的外部声明,即使它们包含static。在这种用法中,“外部”是指功能之外。关于短语“外部联系”,“外部”是指翻译单位外部的联系。在声明中,关键字static既可以影响链接(在函数外部将其从默认值更改为外部的默认值,也可以在函数内部将无链接的值更改)和存储持续时间(将其更改为函数内部的默认自动值是静态存储持续时间)。从数组大小固定的意义上说,定义int a[5]是静态定义。不幸的是,我们只是被这些多重影响和含义所困,您将不得不学习它们。