为什么要使用using namespace?

一、原因:命名冲突

在c语言中,我们很容易将变量名命名成头文件中的函数名,造成命名冲突。例如下图,

e11bb76dc7d9401785de552df24109fc.pngstdlib.h中命名了rand函数,我们将此头文件包含进去后,再定义一个名为rand的变量,则会导致命名冲突,编译失败。同样的,在一个大工程或大项目中,不同的人负责不同的模块,对不同的变量可能会有相同的命名,最后合并到一起后,也会造成命名冲突。因此,为了避免命名冲突或名字污染,c++中引入了命名空间,对标识符的名称进行本地化,关键字为namespace。

二、命名空间的定义

f8594345f1084146bd95405bd9fd7945.png

zky为命名空间名,我在这用的是我自己名字的缩写,在一些大工程项目中一般用项目名字做命名空间名。命名空间中可定义函数、变量、类型。同时,命名空间中可实现嵌套,如:

5d037ed5a4364330b6bdb6738dcdcd28.png

这段代码中实现了在命名空间N1中嵌套了命名空间N2。

注意:在同一个工程中,允许存在多个相同名称的命名空间,编译器最后会合成到同一个命名空间中。

三、命名空间的使用

一个命名空间就定义了一个新的作用域,叫命名空间域。此外还存在全局域,局部域。在输出一个变量时,编译器首先会在局部域内寻找,在局部域中未找到对应变量后则在全局域中查找。若我们没有将命名空间域打开,则就算在全局域中没有找到对应变量,编译器也不会去命名空间域中查找!

那如何将命名空间打开呢?有三种方法:

1.加命名空间名称及作用域限定符

5cdb04b1b3a74828b76a6d5c138c44aa.png

其中的 ::为作用域限定符,前面加N表示直接查找命名空间N中的a。若::前面什么也不加,则表示直接查找全局域中的a。

2.使用using将命名空间中某个成员引入

80e4b7843c504c6991c6c938a37a628e.png

使用 using N::b 表示将命名空间域N中的b变量打开,而不是打开整个命名空间域。

3.使用using namespace 命名空间名称 引入

0c1ea3f6c4cc4e8084c288d6bc81ce8a.png

这是我们平时练习时最常用的一种,也就是为什么平时在代码的最前面总要加上 using namespace std 这句话。std是c++中的一个标准库,其中包括了c++的stl库与其他库。using namespace std则表示将std中所有库都展开在代码中,使我们平时的练习更方便。但直接展开也有一定的风险,若我们其中的一个定义与库重名,则编译器会报错。所以在一个项目中,建议用第二种方法,将命名空间中的某些成员单独引入,降低风险。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值