块中声明的所有变量是否都“无链接”?
例如:
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(使用前将#替换为@)