在我的程序中,我有一个名为constants.h
的文件,它在全局范围内声明了以下矩阵(矩阵应该是完全不变的 - 如果有人发现潜在的问题,请告诉我):
static unsigned char const MY_MATRIX[66][9] = {...};
在另一个文件中,我们称之为main.c
,我实际上可以引用此常量:
doSomething(var1, count, MY_MATRIX[42], TRUE, FALSE, thing);
但后来我只是阅读了关键字static
的定义,它的假设意味着变量不能在其定义的文件之外被访问。 (在这种情况下,所需的行为是应该访问它,但似乎extern
关键字是要使用的!)
那么,谁能告诉我为什么这样有效?为什么变量不可见?谢谢!
答案 0 :(得分:4)
这是因为您在标题中声明了一个static
变量:当您在C文件中包含标题时,您将获得一个独立于其他定义的全新定义。如果将标题包含在两个文件中,则会获得两个独立副本;如果将它包含在三个C文件中,则会获得三个独立副本,依此类推。副本不会相互冲突,因为static
定义会将它们隐藏在链接器中。
使用静态内存中分配的共享数据的正确方法是在标头中生成声明extern
,然后在一个C文件中添加非静态定义。
答案 1 :(得分:2)
如果它位于标题中,则会在您包含它的每个源文件中定义它(尽管每个源文件都有自己的实例化 - 它们不会访问相同的文件)。
答案 2 :(得分:1)
static关键字有两种用途:
在这里,您可以在头文件中定义矩阵,因此包含该头文件的所有.c文件都可以看到它。要限制其可见性,请将其定义为.c文件。
答案 3 :(得分:0)
通常在头文件中声明静态变量时,其范围不限于.h文件,这意味着头文件范围。翻译单元包括源文件中头文件的文本。因此,包含头文件的每个翻译单元都有自己的个人变量,尽管它是静态范围。