这个程序是否符合c ++标准?
namespace X { int i = 1; }
using namespace X;
int main() {
extern int i;
i = 2;
}
我使用不同的编译器得到不同的结果:
GCC和Clang给出了链接器错误:对i的未定义引用。
Visual c ++接受该程序。
答案 0 :(得分:3)
[basic.link] / P6:
如果存在具有相同名称和类型的链接的实体的可见声明,忽略在最内部封闭命名空间范围之外声明的实体,则块范围声明声明该实体并接收链接先前的声明。如果存在多个这样的匹配实体,则该程序是不正确的。否则,如果未找到匹配的实体,则块范围实体将接收外部链接。
on *:JOIN:#channel {
.msg $chan $nick take time to register with me; a pm will be sent to you soon
}
被声明在extern声明的最内部封闭命名空间之外(即全局命名空间),因此它被忽略。这意味着没有找到X::i
的声明,因此i
是一个名为extern int i
的新变量的声明,带有外部链接。
您的程序将编译,但如果块范围i
被使用,则不会链接。