在范围范围内没有联系?

use*_*214 10 c++ static extern linkage

块中声明的所有变量都没有"无连接"吗?

例如:

1:

如果我声明一个静态变量:

void foo()
{
   static int i;
}
Run Code Online (Sandbox Code Playgroud)

它会有内部联系还是没有联系?如果没有联动,那为什么要让它静止?

2:

如果我使用extern会发生什么?

/*global scope*/
static int i;

void foo()
{
    extern int i;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将是什么联系i

seh*_*ehe 6

实际上,在功能范围内"没有联系".

目标是生命周期管理:静态具有全局静态的生命周期,而它具有本地的可见性(范围).

注意

在C++中,您还可以通过将它们封装在匿名命名空间中来声明静态('globals')而不需要链接.此技巧通常用于仅限标头的库中:

namespace /*anon*/
{
    void foo() {}    // only in this translation unit
    int answer = 42; // this too
}
Run Code Online (Sandbox Code Playgroud)

如果我使用extern会怎么样?

如果使用extern,则extern声明仅为声明(未定义任何内容).因此,通常会根据定义预期外部链接 - 在另一个翻译单元中定义.(因此它的行为与在全局范围内声明时的行为相同).这类似于本地函数声明:

int main()
{
    void exit(int); // equivalent to non-local declaration
}
Run Code Online (Sandbox Code Playgroud)

请注意,在您的2.示例中,变量i已经声明static,因此不会获得外部链接.不过,我可能会在另一个没有链接器冲突的翻译单元中声明.