在块范围内没有链接

No linkage at block scope?

本文关键字:链接 范围内      更新时间:2023-10-16

在一个块中声明的所有变量都有'无链接'吗?

例如:

1:

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

void foo()
{
   static int i;
}

有内部链接还是没有链接?如果没有链接,那么为什么要将其设置为静态呢?

2:

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

/*global scope*/
static int i;
void foo()
{
    extern int i;
}

在这种情况下,i的链接是什么?

确实,在函数范围内'no linkage'。

目标是生存期管理:静态具有全局静态的生存期,同时具有局部静态的可见性(作用域)。

注意

在c++中,你也可以通过将静态变量('globals')封装在一个匿名命名空间中来声明没有链接的静态变量。这个技巧通常用于头文件库:

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

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

如果使用extern,则声明仅为extern声明(没有定义)。因此,根据定义,通常期望外部链接在另一个翻译单元中定义。(因此,它的作用与在全局作用域声明时相同)。这类似于局部函数声明:

int main()
{
    void exit(int); // equivalent to non-local declaration
}

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

  1. "它有内部链接还是没有链接?"如果没有联动,为什么要让它静止呢?"——它没有连杆。static指定静态存储时间

  2. "如果我使用extern会发生什么?"它将是一个带有外部链接的名称声明,由于在全局作用域中没有链接,因此程序将报告链接错误。编辑:由于之前的static声明在作用域中可见,标准说名称"接收先前声明的链接"3.5/6,因此foo()中的i将具有内部链接。