静态与全局

Vij*_*jay 67 c static global

如果我有一个如下所示的C文件,i和之间有什么区别j?

#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 61

i具有内部链接,因此您无法i在其他源文件(严格翻译单元)中使用该名称来引用同一对象.

j具有外部链接,因此j如果您extern在另一个翻译单元中声明它,则可以使用它来引用此对象.

  • 如果你在做同样的事情,运行时就不应该有差异,因为编译器可能会生成相同的代码。但是,全局编译可能会稍长一些,因为它的范围更广。 (2认同)

wal*_*lyk 21

i模块外部不可见; j是全球可访问的.

也就是说,与其链接的另一个模块可以做到

extern int j;
Run Code Online (Sandbox Code Playgroud)

然后能够读取和写入值j.同一个其他模块无法访问i,但可以声明自己的实例,即使是全局实例 - 第一个模块也看不到它.


Han*_*s W 5

区别在于i具有内部链接和j具有外部链接。这意味着您可以j从与之链接的其他文件进行访问,而i仅在声明该文件的文件中可用。


Ram*_*hna 5

i将具有静态链接,即该变量只能在当前文件中访问。

j应定义为extern,即

extern int j;
Run Code Online (Sandbox Code Playgroud)

放在另一个头文件( .h)中,那么它就具有外部链接,并且可以跨文件访问。