用namespace命名空间可以避免很多厂商自己造的轮子与其他厂商的产生命名冲突,所以,可以将自己写的一些函数包装在namespace中,既可以放心的使用自家造的轮子,也避免命名冲突 。
项目场景:
使用namespace的命名空间变量解决名称冲突问题
问题描述:
fill中的val 和 全局变量val产生二义性
#include<iostream>
using namespace std;
#include<string>
namespace fill
{
int val = 20;
}
int val = 10;
int main()
{
using namespace fill;
cout << "val = " << val << endl; //fill中的val 和 全局变量val产生二义性
system("pause");
}
原因分析:
使用了namespace之后表示可以不用再加命名空间限定自己定义的变量或者函数了,但是此时有同名变量或者函数时就导致编译器无法知道使用者的意图。
解决方案:
1.在调用相同名称的变量或者函数时,在前面加上名称空间
和解析运算符::
#include<iostream>
using namespace std;
#include<string>
namespace fill
{
int val = 20;
string str = "fill";
void test_01() { cout << "fill test_01()" << endl; }
}
namespace fill2
{
string str = "fill2";
}
void test01()
{
cout << "fill str = " << fill::str << endl;
cout << "fill2 str = " << fill2::str << endl;
}
int main()
{
test01();
}
输出结果:
2.其中 拿一个举例,
如果加上 using fill::val ,那么此时全局的val就只能用::val表示,命名空间中的可以直接使用val或者用命名空间限定。
如果不加 using fill::val ,那么此时全局的val 就可以用val和::val表示,此时val就只能用命名空间限定来访问。
#include<iostream>
using namespace std;
#include<string>
namespace fill
{
int val = 20;
string str = "fill";
void test_01()
{
cout << "fill test_01()" << endl;
}
}
void test_01()
{
cout << "globle test_01()" << endl;
}
int val = 10;
int main()
{
//using namespace fill; //如果加入这个就会导致直
//接使用val会造成二义性
using fill::val;
using fill::test_01;
::test_01();
test_01();
cout << "val = " << ::val << endl;
cout << "val = " << val << endl;
system("pause");
}
运行结果图: