在范围范围内没有联系?

时间:2011-11-23 00:32:27

标签: c++ static extern linkage

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

例如:

1

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

void foo()
{
   static int i;
}

是否有内部联系或没有联系?如果没有联动,那为什么要把它变成静态?

2

如果我使用extern会怎样?

/*global scope*/
static int i;

void foo()
{
    extern int i;
}

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

2 个答案:

答案 0 :(得分:6)

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

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

注意

在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 :(得分:1)

  1. “它是否有内部链接或没有链接?如果没有链接那么为什么要使它静止?” - 它没有联系。 static指定静态存储持续时间。

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