C++11 标准给出了下面的代码片段(我删除了不相关的代码)并说名称i
具有外部链接。(第 3.5.6 条)
static int i = 0; // #1
void g() {
extern int i; // #3 external linkage
}
他们为什么这样做呢?我是不是误会了什么?两者i
在vs2012中指的是同一个对象。当我在i
其他地方使用时,我得到了一个未解决的外部错误。我不知道 vs2012 是否支持这个功能。
编辑:我认为 VS2012 正在做正确的事情。#3中的i
只需要引用i
具有链接的an。如果编译器找不到,则i
应该在其他翻译单元中定义。所以这两者i
应该在上面的代码片段中引用同一个对象。
来自标准的报价:
如果存在具有相同名称和类型的链接的实体的可见声明,忽略在最内层封闭命名空间范围之外声明的实体,块范围声明声明相同的实体并接收前一个声明的链接。如果没有找到匹配的实体,则块范围实体接收外部链接。
但是为什么人们需要这个功能呢?