命名空间
在C语言中,我们使用创建变量时可能会和库里已有名字冲突(比如别人写了一个库函数,内部自己命名了一些变量,但我们使用时不知道,就可能导致命名冲突)。了解命名空间前,我们要先了解一下域的概念。
域
C++中域被分为4种,分别为:全局域,局部域,命名空间域,类域。域就代表不同区域,在全局变量中,我们可以用命名空间域把多个相同名字的变量隔开。
::被称为域作用限定符。它能限制使用的变量的范围,使用方法为,范围::变量名,范围不给时,默认为全局域。
命名空间域关键字
namespace 空间名{定义变量}
命名空间关键字为namespace 空间名{定义变量}。命名空间域只能用于分割全局变量。所以,命名空间解决的就是全局变量与全局变量或者全局变量与库函数内变量冲突的问题。
命名空间域只在多个全局变量的变量名冲突时使用。访问命名空间域中的变量时,需要用域作用限定符(::),使用方法为,命名空间名::变量名。
命名空间域内还可以创建函数、结构体。命名空间域内的结构体访问方法与变量和函数不同,访问命名空间域结构体方法:struct 命名空间名::结构体名称 结构体变量名,例如:struct tree::Node phead;
注意:当定义多个相同名字的命名空间域时,会把重复定义的命名空间结合(同个名字的命名空间内,不能定义同名变量)。命名空间可以嵌套,调用时需要使用两次域作用限定符
using namespace 命名空间名
若写成using namespace 命名空间名(慎用),就是展开命名空间,把原命名空间域的锁打开,让其中的所以变量、函数、结构体重新变成全局性的,即不用域作用限定符也能访问到原命名空间域中的内容。
using 命名空间名::函数名/变量名
如果我们只想使用一个域里的某个函数或者变量,就可以用using 命名空间名::函数名/变量名,只展开某个域内的某个函数或者变量,这样就不会让一个域内的全部内容都展开,导致出现全局变量重复的情况。
编译器搜索变量原则:不指定域时,先搜索当前局部域,再搜索全局域;如果使用了域操作符指定了空间,就直接去该空间搜索。