一、关键字
namespace
二、目的
对标识符的名称进行本地化,以避免命名冲突和名字污染
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main(){
printf("%d\n",rand);
return 0;
}
//编译后报错,原因是:rand在C语言中是函数,而C++又是兼容C语言的。
//C语言无法解决该问题,于是C++引入命名空间这一概念
三.定义
1.正常定义
namespace bit{
int rand = 10;
int Add(int left,int right){
return left+right;
}
struct Node{
struct Node*next;
int val;
}
}
2.嵌套
namespace N1{
int rand = 10;
int Add(int left,int right){
return left+right;
}
namespace N2{
int a = 10;
int b= 5;
int Sub(int left,int right){
return left - right;
}
}
}
3.同一工程允许存在多个同名的命名空间,编译器最后会合成同一个命名空间
//test.cpp
namespace N1{
int a = 10;
int b= 5;
int Sub(int left,int right){
return left - right;
}
//test.h
namespace N2{
int c = 10;
int d= 5;
int Mul(int left,int right){
return left * right;
}
四、使用
1.不展开命名空间
int main(){
printf("%d\n",N::a);
return 0;
}
2.展开命名空间中的某个成员
using N::b
int main(){
printf("%d\n",N::a);
printf("%d\n",b);
return 0;
}
3.展开命名空间
using namespcae N
int main(){
printf("%d\n",N::a);
printf("%d\n",b);
Add(10,20);
return 0;
}
五、注意点
1.当展开命名空间后,编译器默认查找顺序a.局部域 b.全局域 b.展开的命名空间(全局域和命名空间的优先级一样)
2.不同域可以定义同名的变量/函数/类型,所以但同时展开两个命名空间时,如果有同名的情况,会有冲突