前言:什么情况下会产生命名冲突的问题呢?分以下两种情况:
1.我们自己定义的变量名,函数名可能与库里面的名字冲突
2.在大型项目中,多人协作的时候,可能会出现使用相同命名的情况,造成冲突。
然而C语言并没有办法可以很好地解决这样一个问题,C++提出了一种新语法,即命名空间来解决命名冲突的问题。
命名空间定义:定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。注意:命名空间是一个域!
//1. 普通的命名空间
namespace Bernard1 // Bernard1为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数
int rand = 0;
int Add(int left, int right)
{
return left + right;
}
}
//2. 命名空间可以嵌套
namespace Bernard2
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace Bernard3
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
namespace Bernard4
{
int Mul(int left, int right)
{
return left * right;
}
}
注意区分函数域和命名空间域:
namespace Bernard1
{
//他们还是全局变量,放到静态区的
int rand = 0;
int a = 0;
}
void f()
{
//局部域
}
命名空间使用:
命名空间的使用有三种方式:
1.加命名空间名称及作用域限定符
指定作用域,起到了最好的隔离效果
namespace Bernard2
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace Bernard3
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
int main()
{
printf("%dn", Bernard2::a);
Bernard2::Bernard3::Sub(3, 4);
return 0;
}
2.使用using将命名空间中部分成员引入
把命名空间中常用的展开
namespace Bernard
{
int a = 10;
int b = 20;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
using Bernard::Node;
using Bernard::b;
int main()
{
printf("%dn", Bernard::a);
printf("%dn", b);
struct Node node1;
struct Bernard::Node node2;//注意结构体指定的位置
Bernard::Add(1, 2);
return 0;
}
3.使用using namespace 命名空间名称引入
把整个命名空间展开--失去了隔离的作用
namespace Bernard
{
int a = 10;
int b = 20;
int Add(int left, int right)
{
return left + right;
}
int Sub(int left, int right)
{
return left - right;
}
}
using namespace Bernard;
int main()
{
printf("%dn", b);
Add(10, 20);
return 0;
}
总结:C++采用命名空间主要是为了防止重命名的情况出现,很好地起到了与外界隔离的效果,将其封装了起来。



