具有命名空间范围的名称的 C++ 内部链接



我的问题与"内部链接"是什么意思非常相似?但我仍然感到困惑,所以我不得不问。

C++11 ISO 说:

具有命名空间范围的名称具有内部链接,如果它是显式声明为静态的变量、函数或函数模板的名称;或...

当名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他范围的名称引用。

但是,在以下代码中:

namespace N {
static int t = 3;
}
int main() {
int p = t + 1; // complain here: t is undefined
return 0;
}

为什么会这样?我的意思是命名空间N的主函数和声明在同一个源文件中,所以它们在同一个翻译单元中,对吧?t 具有命名空间范围并显式声明为静态。那么为什么仍然没有找到t呢?

您混合了两个单独的概念:范围和链接。

范围告诉您名称的可见位置。命名空间范围意味着名称在定义它的命名空间中可见。在该命名空间之外,该名称不可见。这就是为什么您必须在不在命名空间N的代码中说N::i

链接是指对象在其他翻译单元中可用。暂时忘记命名空间;static int i = 3;将创建一个名为iint类型对象,初始值为 3。因为它被标记为static它有内部链接。该对象可以在定义其的翻译单元(松散地,相同的源文件(中使用。它不能用于任何其他翻译单元。因此,如果另一个源文件说extern int i;并试图对i做某事,它就不会链接:未定义的符号 i。

引用的文本讨论了这两者的交集:在命名空间内定义的静态对象。它有点模糊,但如果你把它读成"它......只能由同一翻译单元中其他范围的名称引用。或者"它...不能任何其他翻译单位中以名称提及。也就是说,它限制了名称的使用方式。它不会扩大名称的范围;它仍在命名空间范围内。

最新更新