Static vs global
如果我有下面这样的C文件,那么i和j有什么区别?
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
} |
- 阅读此问题的答案:stackoverflow.com/questions/1358400/&hellip;
- C、C++环境下静态变量、自动变量、全局变量和局部变量的区别
i具有内部链接,因此不能在其他源文件(严格的翻译单位)中使用i名称来引用同一对象。
j具有外部链接,因此,如果在另一个翻译单元中声明该对象,则可以使用j来引用该对象。
- 性能有什么不同吗?
- 如果你在做同样的事情,就不应该有运行时的差异,因为编译器可能会生成相同的代码。不过,使用全局编译可能会稍微长一些,因为它的范围更广。
i在模块外不可见;j可全局访问。
也就是说,链接到它的另一个模块可以
然后能够读写j中的值。另一个模块不能访问i,但可以声明它自己的实例,甚至是第一个模块看不到的全局实例。
- 是否需要"外部"声明?
- 这取决于实现。如果一个模块具有非extern和公共(分配)符号,则使用extern可保证不会造成故障。早期的Unix实现将具有相同名称的符号合并在一起,非常类似于Fortran公共符号,因此不需要extern。
- 注意,"不可见"并不意味着它超出了范围。这意味着,如果您在另一个编译单元中声明一个i,并从.c文件中删除静态i,则全局i对您的.c文件是可见的。相反,如果全局i超出范围,那么在.c文件中声明一个静态i就不重要了。全球的那颗永远都看不见。静态i优先于另一个编译单元中定义的全局i,称为"阴影"。它也发生在函数局部,而不是C++ +C唯一的东西。
区别在于i有内部链接,j有外部链接。这意味着您可以从链接的其他文件访问j,而i仅在声明它的文件中可用。
i将具有静态链接,即变量只能在当前文件中访问。
j应定义为extern,即
在另一个头文件(.h中),它将具有外部链接,并且可以跨文件访问。
静态变量/函数的范围在同一个文件中,尽管您将该文件作为另一个源文件的一部分包含在内。
全局变量的范围是包含它的整个文件。为了将变量包含在不同的源文件中,我们在变量声明之前使用extern。在这种情况下,不再为变量分配内存。
extern用于声明C变量而不定义它。extern关键字扩展了C变量和C函数的可见性。由于默认情况下,函数在程序外可见,因此在函数声明/定义中不需要使用extern。它的使用是多余的。