using 关键字的使用主要分为两种类型:using declaration(using 声明)和using directive(using 命令):
using 声明:引入特定名称空间中的一个成员。
using 命令:使特定名称空间中的所有名字可见。
1 namespace Myspace 2 { 3 int a = 10; 4 double b = 100.0; 5 const int c = 1000; 6 } 7 8 int var = 0; 9 // 位置1 10 11 int main() 12 { 13 // 位置2 14 double b = 200.0; 15 int d = c + 1; 16 ++a; 17 ++::a; 18 19 return 0; 20 }
将using 声明和using 命令分别插入<位置1>和<位置2>,会发生什么情况呢?如下分析:
(1) 在<位置1>插入using 声明:
1 namespace Myspace 2 { 3 int a = 10; 4 double b = 100.0; 5 const int c = 1000; 6 } 7 8 int a = 0; 9 // 位置1: 插入using 声明 10 using Myspace::a; /** error: 'a' is already declared in this scope */ 11 using Myspace::b; 12 using Myspace::c; 13 14 int main() 15 { 16 // 位置2 17 double b = 200.0; /** 局部 b */ 18 int d = c + 1; /** d = Myspace::c + 1 */ 19 ++a; /** 二义性 */ 20 ++::a; /** ++a */ 21 22 return 0; 23 }
说明:
将名称空间Myspace中所有成员的using 声明放在<位置1>,则a、b、c立即在<位置1>处变为可见,接着程序中有定义了变量a,此时,必然会发生重定义错误。main函数中的局部变量b则会屏蔽全局变量Myspace::b,因此可以编译通过。
(2) 在<位置2>插入using 声明:
1 namespace Myspace 2 { 3 int a = 10; 4 double b = 100.0; 5 const int c = 1000; 6 } 7 8 int a = 0; 9 // 位置1 10 11 int main() 12 { 13 // 位置2: 插入using 声明 14 using Myspace::a; 15 using Myspace::b; 16 using Myspace::c; 17 18 double b = 200.0; /** error: redeclaration of 'double b' */ 19 int d = c + 1; /** d = Myspace::c + 1 */ 20 ++a; /** ++Myspace::a */ 21 ++::a; /** ++a */ 22 23 return 0; 24 }
说明:
将a、b、c的using 声明移到<位置2>,此时,b相当于定义了两次,编译错误。此时的a有两个值,++a表示访问函数局部的a,也就是Myspace::a,因为Myspace::a把全局的a屏蔽掉了。而++::a意为显示访问全局变量。
(3) 在<位置1>插入using 命令:
1 namespace Myspace 2 { 3 int a = 10; 4 double b = 100.0; 5 const int c = 1000; 6 } 7 8 int a = 0; 9 // 位置1: 插入using 命令 10 using namespace Myspace; 11 12 int main() 13 { 14 // 位置2 15 double b = 200.0; /** 局部 b */ 16 int d = c + 1; /** Myspace::c */ 17 ++a; /** reference to 'a' is ambiguous*/ 18 ++::a; /** ++a */ 19 20 return 0; 21 }
说明:
++a由于不知调用Myspace::a还是a,因此,出现二义性,可以考虑改为++Myspace::a,而++::a意义非常明确。
(4) 在<位置2>插入using 命令:
1 namespace Myspace 2 { 3 int a = 10; 4 double b = 100.0; 5 const int c = 1000; 6 } 7 8 int a = 0; 9 // 位置1 10 11 int main() 12 { 13 // 位置2: 插入using 命令 14 using namespace Myspace; 15 16 double b = 200.0; /** 局部 b */ 17 int d = c + 1; /** Myspace::c */ 18 ++a; /** reference to 'a' is ambiguous*/ 19 ++::a; /** ++a */ 20 21 return 0; 22 }
说明:
解释同(3)。