块范围内没有链接?

2024-03-20

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

例如:

1:

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

void foo()
{
   static int i;
}

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

2:

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

/*global scope*/
static int i;

void foo()
{
    extern int i;
}

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


事实上,在函数范围内“没有链接”。

目标是lifetime管理:静态有lifetime全局静态的,同时它有能见度(范围)本地的。

Note

在 C++ 中,您还可以通过将静态变量(“全局变量”)包含在匿名命名空间内来声明不带链接的静态变量。这个技巧通常用在只有头文件的库中:

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

块范围内没有链接? 的相关文章

随机推荐