一、原因:命名冲突
在c语言中,我们很容易将变量名命名成头文件中的函数名,造成命名冲突。例如下图,
stdlib.h中命名了rand函数,我们将此头文件包含进去后,再定义一个名为rand的变量,则会导致命名冲突,编译失败。同样的,在一个大工程或大项目中,不同的人负责不同的模块,对不同的变量可能会有相同的命名,最后合并到一起后,也会造成命名冲突。因此,为了避免命名冲突或名字污染,c++中引入了命名空间,对标识符的名称进行本地化,关键字为namespace。
二、命名空间的定义
zky为命名空间名,我在这用的是我自己名字的缩写,在一些大工程项目中一般用项目名字做命名空间名。命名空间中可定义函数、变量、类型。同时,命名空间中可实现嵌套,如:
这段代码中实现了在命名空间N1中嵌套了命名空间N2。
注意:在同一个工程中,允许存在多个相同名称的命名空间,编译器最后会合成到同一个命名空间中。
三、命名空间的使用
一个命名空间就定义了一个新的作用域,叫命名空间域。此外还存在全局域,局部域。在输出一个变量时,编译器首先会在局部域内寻找,在局部域中未找到对应变量后则在全局域中查找。若我们没有将命名空间域打开,则就算在全局域中没有找到对应变量,编译器也不会去命名空间域中查找!
那如何将命名空间打开呢?有三种方法:
1.加命名空间名称及作用域限定符
其中的 ::为作用域限定符,前面加N表示直接查找命名空间N中的a。若::前面什么也不加,则表示直接查找全局域中的a。
2.使用using将命名空间中某个成员引入
使用 using N::b 表示将命名空间域N中的b变量打开,而不是打开整个命名空间域。
3.使用using namespace 命名空间名称 引入
这是我们平时练习时最常用的一种,也就是为什么平时在代码的最前面总要加上 using namespace std 这句话。std是c++中的一个标准库,其中包括了c++的stl库与其他库。using namespace std则表示将std中所有库都展开在代码中,使我们平时的练习更方便。但直接展开也有一定的风险,若我们其中的一个定义与库重名,则编译器会报错。所以在一个项目中,建议用第二种方法,将命名空间中的某些成员单独引入,降低风险。