目录
1.命名空间是什么——解决命名冲突
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染。
2.产生命名冲突的原因
在完成同一个项目的时候,三方的命名可能会产生冲突。
3.表达形式
命名空间里面可以定义变量,函数,类型等
namespace 是关键字,定义一个命名空间域
namespace field
{
int rand = 10;//变量
int Add(int a,int b)//函数
{
return a + b;
}
struct Node//结构体
{
struct Node* next;
int data;
};
}
4.域作用限定符 ::的使用
::是指定的意思,改变了编译器的查找规则,默认从全局空间里面去找,不会进入命名空间,::让他去命名空间里面去找,这个时候哪怕全局空间里面有与命名定义域内相同命名的函数Add,但是编译器找到的是命名空间里面的Add。
结构体和其他两种类型有一些不同
int main() { printf("%d\n", field::rand); printf("%d\n", field::Add(4,2)); struct field::Node data; return 0; }
6.命名空间的展开
全部展开(授权)
using namespace filed;
上面这个语句可以将filed这个域全部展开,展开之后,域里面定义的各种,则可以不通过::直接访问
这个时候就需要注意,全局空间里面就不能出现与rand相同名字的变量,会命名冲突
感觉展开之后,命名空间域里面的各种定义和在全局空间中的定义就没有什么使用上的区别了。
部分展开(授权)
using field::Add;只展开命名空间域里面的部分定义。
7.命名空间的特点
可以嵌套,空间域里面套空间域。
namespace field
{
int rand = 10;//变量
namespace XX
{
int rand = 20;
}
}
int main()
{
printf("%d\n", field::XX::rand);
return 0;
}
相同名字的命名空间域会自动合并
下面的名字相同的两个域会合并,其实就相当于一个域,所以会产生下面的重定义的错误。
namespace field
{
int rand = 10;//变量
namespace XX
{
int rand = 20;
}
}
namespace field
{
int rand = 30;
}
int main()
{
printf("%d\n", field::XX::rand);
return 0;
}