STL 静态常量成员定义

3
以下是如何运作的?
#include <limits>

int main()
{
  const int* const foo = &std::numeric_limits<int> ::digits;
}

我曾认为,为了获取静态常量成员的地址,我们必须在某个翻译单元中物理定义它,以便取悦链接器。然而,在查看此TU的预处理代码后,我没有找到digits成员(或任何其他相关成员)的外部定义。
我在两个编译器上进行了测试(VC++ 10和g++ 4.2.4),并从两者获得了相同的结果(即它起作用)。链接器是否自动地链接到定义这些内容的对象文件,还是我忽略了一些明显的东西?
1个回答

2

那么,是什么让你认为它没有被定义?你尝试获取地址成功的事实自动表明它在某处被定义了。当然,它不一定需要驻留在你的翻译单元中,因此查看预处理器输出并没有太多意义。


好的,有两件事情:1)我认为限制头文件可能会将其引入我的翻译单元。但似乎不是这种情况。2)我查看了VS的链接器命令行,没有发现任何被隐式指定的“外部”目标文件。 - javery
1
@javery:为什么要外部的?定义必须是标准库的一部分。你确实链接了标准库,对吧? - AnT stands with Russia
我所说的“外部”是指不属于我的文件,包括标准库。抱歉让你们产生了困惑。 :) - javery
@javery:你的代码仅包含标准头文件。标准库的“实质部分”位于一个通常会被隐式链接到你的项目中的中。 - AnT stands with Russia
找到了。像你说的那样,是隐式链接的。因为它没有在任何地方明确列出作为一个额外的依赖,所以有些困惑。干杯。 - javery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接