11

块中声明的所有变量是否都“无链接”?

例如:

1:

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

void foo()
{
   static int i;
}

它有内部链接还是没有链接?如果没有链接,那为什么要让它静态呢?

2:

如果我使用外部会发生什么?

/*global scope*/
static int i;

void foo()
{
    extern int i;
}

在这种情况下, 的联动是i什么?

4

2 回答 2

6

实际上,在功能范围内“没有联系”。

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

笔记

在 C++ 中,您还可以通过将静态变量(“全局变量”)包含在匿名命名空间中来声明它们而无需链接。此技巧通常用于仅标头库中:

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,因此它不会获得外部链接。不过,我可能会在没有链接器冲突的情况下在另一个翻译单元中声明。

于 2011-11-23T00:35:47.467 回答
1
  1. “它会有内部链接还是没有链接?如果没有链接,那为什么要让它静态呢?” ——它没有联系。static指定静态存储时长。

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

于 2011-11-23T00:37:58.007 回答