奇数C行为:变量不可见时可见

时间:2012-12-16 16:09:27

标签: c static visibility

在我的程序中,我有一个名为constants.h的文件,它在全局范围内声明了以下矩阵(矩阵应该是完全不变的 - 如果有人发现潜在的问题,请告诉我):

static unsigned char const MY_MATRIX[66][9] = {...};

在另一个文件中,我们称之为main.c,我实际上可以引用此常量:

doSomething(var1, count, MY_MATRIX[42], TRUE, FALSE, thing);

但后来我只是阅读了关键字static的定义,它的假设意味着变量不能在其定义的文件之外被访问。 (在这种情况下,所需的行为是应该访问它,但似乎extern关键字是要使用的!)

那么,谁能告诉我为什么这样有效?为什么变量不可见?谢谢!

4 个答案:

答案 0 :(得分:4)

这是因为您在标题中声明了一个static变量:当您在C文件中包含标题时,您将获得一个独立于其他定义的全新定义。如果将标题包含在两个文件中,则会获得两个独立副本;如果将它包含在三个C文件中,则会获得三个独立副本,依此类推。副本不会相互冲突,因为static定义会将它们隐藏在链接器中。

使用静态内存中分配的共享数据的正确方法是在标头中生成声明extern,然后在一个C文件中添加非静态定义。

答案 1 :(得分:2)

如果它位于标题中,则会在您包含它的每个源文件中定义它(尽管每个源文件都有自己的实例化 - 它们不会访问相同的文件)。

答案 2 :(得分:1)

static关键字有两种用途:

  • 功能块内的静态变量在后续调用之间保持其值。
  • 静态全局变量或函数仅在声明它的文件中“可见”。

在这里,您可以在头文件中定义矩阵,因此包含该头文件的所有.c文件都可以看到它。要限制其可见性,请将其定义为.c文件。

答案 3 :(得分:0)

通常在头文件中声明静态变量时,其范围不限于.h文件,这意味着头文件范围。翻译单元包括源文件中头文件的文本。因此,包含头文件的每个翻译单元都有自己的个人变量,尽管它是静态范围。