首先要知道什么是命名空间,命名空间被创建的目的是什么,命名空间可以解决哪一类问题,带着这三个疑惑去理解命名空间,学懂命名空间。
在C/C++中,变量、函数是大量存在的,这些变量、函数的名称将都存在于全局作用域中,因此可能会导致很多冲突,为了解决此问题,C++引入命名空间的概念,对标识符的名称进行本地化,以避免命名冲突或名字污染。
举个例子,如果两个程序员合作完成一个项目,两人创建的结构体均命名为LIST,当两者程序合并时,系统会显示重复定义错误,这时该如何解决问题呢?难道只能修改结构体名称吗?要知道这时一项很繁杂的工作。为了避免此类事情的发生,C++准备了两个控件,分别装载了两个程序员的代码,使其分隔开,互不干扰。
typedef struct Node//程序员A的代码
{
struct Node* a;
int cor;
char x;
}Node;
typedef struct Node//程序员B的代码
{
struct Node* a;
int cor;
}Node;
//以上均包含在不同的头文件中
int main()
{
struct Node a;
system("pause");
return 0;
}
例如上述情况,存在重复定义的情况,
此时编译器会报错:error C2011: “Node”:“struct”类型重定义。这里就可以使用命名空间来解决,如下:
#include"test1.h"
#include"test2.h"
#include<iostream>
using namespace std;
namespace A
{
int a = 10, b = 1;
typedef struct Node//程序员A的代码
{
struct Node* a;
int cor;
char x;
}Node;
}
namespace B
{
int a = 20, b = 2;
typedef struct Node//程序员B的代码
{
struct Node* a;
int cor;
}Node;
}
int main()
{
int x = A::a;
int y = B::a;
cout << x << endl;
cout << y << endl;
return 0;
}
运行结果如下:
命名空间的使用方式有三种:
- 加命名空间名称及作用域限定符
在使用时加入限定符,准确定位到想用的成员,但缺点是看起来显得较为冗余,每一次使用都需要调用,使整体代码显得很繁杂。
int main()
{
printf("%d\n",A::a);
return 0;
}
- 使用using将命名空间中某个成员引入
事先将常用的成员变量引入,避免后面的多次引用,此方法最为常用,并且使用也很方便。
using A::a;
int main()
{
printf("%d\n",A::a);
printf("%d\n",b);
return 0;
}
- 使用using namespace 命名空间名称引入
直接将命名空间内的所有成员变量均引入,但是有部分弊端,例如我们在使用原始库的时候,所有的成员变量都引入了,在我们写自定义函数的时候会无意的与库里面的函数重复定义了,有时会造成不必要的麻烦,一般不使用这种方法,除了对于自己定义的命名空间并且过程量较小的时候。
using namespace A;
int main()
{
printf("%d\n",A::a);
printf("%d\n",b);
return 0;
}
总结:
命名空间是C++为了弥补一些C语言的缺陷而创建的,应用范围还是比较广的,之后也会有很多只是综合用法,还是值得去探究的。