为什么成功编译以下代码:
#include <stdio.h>
namespace B
{
void foo();
int i=3;
}
void B::foo()
{
i=65;
}
int main(){ }
并且未成功编译以下内容:
#include <stdio.h>
namespace B
{
void foo()
{
i=65;//error: ‘i’ was not declared in this scope
}
int i=3;
}
int main(){ }
我想从标准中找到一个澄清的时刻。
答案 0 :(得分:3)
因为你需要引号3.4.1 [basic.unqual.lookup]:
/ 4在全局范围内使用的名称,在任何函数,类或用户声明的命名空间之外,应在全局范围内使用之前声明。
/ 6在函数的declarator-id28之后的函数定义中使用的名称是名称空间N的成员(其中,仅用于说明的目的,N可以表示全局作用域)在使用之前应声明在使用它的块中或在其中一个封闭块(6.3)中,或者在它在命名空间N中使用之前声明,或者,如果N是嵌套命名空间,则应在其在N的封闭命名空间之一中使用之前声明
答案 1 :(得分:1)
在第一个示例中,foo
在名称空间B
中声明,因此将首先在其名称空间内搜索i
(并找到这样的i
,因为foo
的实现是在i
的名称空间声明之后。在第二个示例中,您在i
的定义后声明foo
,因此f
不会&#34;请参阅&#34; i
。