1

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

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

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

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

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

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

4

4 回答 4

4

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

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

于 2012-12-16T16:12:45.650 回答
2

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

于 2012-12-16T16:12:30.607 回答
1

static 关键字有两种用途:

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

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

于 2012-12-16T16:17:15.703 回答
0

通常,当在头文件中声明静态变量时,其范围不限于 .h 文件,这与头文件范围完全不同。翻译单元将头文件中的文本包含在源文件中。因此,包括头文件在内的每个翻译单元都有自己的单独变量,尽管它是静态范围。

于 2012-12-16T16:31:51.047 回答