15.2 实体的作用域与可见域
名称空间可以如代码15.1中的yaya和abao一样,定义成全局的,也可以将一个名称空间定义在另一个名称空间内,形成名称空间的嵌套,但名称空间的定义不能在代码块内。因此在默认情况下,名称空间中的实体作用域是全局的。
15.2.1 实体可见域
名称空间中实体的作用域是全局的,并不意味着其可见域也是全局的,如果不使用作用域限定符和using机制,抛开名称空间嵌套和内部屏蔽的情况,实体的可见域是从实体创建到该名称空间结束(如果有名称空间的嵌套,则内部名称空间中的实体可能会屏蔽外部名称空间中的实体,这在稍后会讲到),在名称空间外,该实体是不可见的。如示例代码15.2所示。
代码15.2 实体可见域VisibleArea
<——————————————-文件名:example1502.cpp————————————> 01 #include<iostream> 02 using namespace std; 03 namespace A//创建名称空间A 04 { 05 void dispA() 06 { 07 cout<<"This is A"<<endl; 08 } 09 } 10 namespace B//创建名称空间B 11 { 12 void dispB() 13 { 14 dispA(); 15 cout<<"This is B"<<endl; 16 } 17 } 18 int main() 19 { 20 dispB(); 21 return 0; 22 }编译运行,编译器给出出错信息如下所示。 error C2065:'dispA':undeclared identifier error C2065:'dispB':undeclared identifier
【代码解析】代码第5和第12行的dispA函数和dispB函数的作用域是全局的,但这并不是说这两个函数的可见域就是全局的,事实上直接使用函数名“dispA()”和“dispB()”形式的调用只能用在该函数的名称空间里,A中定义的dispA函数在名称空间B中是不可见的,同理在外部函数main中,名称空间B中定义的dispB函数也是不可见的。