#define _CRT_SECURE_NO_WARNINGS #includeusing namespace std; namespace YuanShen { int HuTao = 100; } void func01() { int HuTao = 648; //using 声明 注意避免二义性问题 //写了using声明后 下面这行代码说明以后看到的HuTao是应是用YuanShen下的 //但是,编译器又有就近原则 //这个就造成了冲突,计算机不知道使用YuanShen下的HuTao还是就近用最近的HuTao //这就是二义性 //using YuanShen::HuTao; cout << HuTao << endl; } //using编译指令 namespace YuanShen { int ZhongLi =100; } void func02() { int ZhongLi = 648; //using编译指令 using namespace YuanShen; //打开原神这个房间,这里只是打开了房间,但是并没用直接调用 cout << ZhongLi<< endl;//因此这个里按照就近原则,输入的应该是648. // 注:当打开多个房间时,也应该注意二义性。 } int main(){ func01(); func02(); system("pause"); return EXIT_SUCCESS; }
注意:使用using声明或using编译指令会增加命名冲突的可能性。也就是说,如果有名称空间,并在代码中使用作用域解析运算符,则不会出现二义性。
命名空间使用
需要记住的关键问题是当引入一个全局的using编译指令时,就为该文件打开了该命名空间,它不会影响任何其他的文件,所以可以在每一个实现文件中调整对命名空间的控制。比如,如果发现某一个实现文件中有太多的using指令而产生的命名冲突,就要对该文件做个简单的改变,通过明确的限定或者using声明来消除名字冲突,这样不需要修改其他的实现文件。