在C中,不知道你有没有这样的苦恼,在一个项目当中有多个文件,每个文件内部都没有问题,但是一但整合在一起,就会有命名冲突的报错,或者你的一个变量是和一个几乎用不上的库函数名冲突,导致的报错,这种报错往往在一些大项目中让人头大,因为在这些代码量较多的项目中,这个变量名不可能只出现一次,改起来会很麻烦,那应该怎么办呢?提前商量好谁用那些吗?这在工程中是不现实的,那这个时候C++的创始人本贾尼大佬就想出了一种解决方案,将他添加到了C++中,这个解决方案就是命名空间。
命名空间实质上也是一种域,在域内,我们可以定义只属于我们自己的变量,通过域限定符来访问我们自己的这个变量。
创建命名空间需要一个关键字namespace,具体的创建如下面代码所示:
namespace test//空间名的名字 { //成员 }
访问命名的空间的方法有三种:
第一种是全部展开,需要用的一个关键字using,用using namespace 命名空间空名就可以直接展开这个命名空间,如在日常写一些题的时候,使用C++都会带一句using namespace std;而不带这一句的时候,虽然使用函数之前引了头文件,但是还是会报错,是未声明的标识符,这个时候在这个函数之前加std::,就可以了,这是为什么?后面加的std::是指定了这个函数在哪个命名空间内查找,std(C++标准库)是这个命名空间的名字,::是域限定操作符,那再前面加了using namespace std就不需要指定去std中找,就可以找到,这是为什么?是因为写了这句话的意思是展开std,std内部的所有成员变成全局的,这也变相的说明了,如果我们不展开或者不限定去哪个命名空间访问,编译器就不会去这个命名空间内查找。
再全部展开的讲解中,提到了域限定符的使用,那这也是我们的一种方法, 是符合我们的全部场景的,也是未来再工作中会用到最多的方法。
在实际的写项目过程中全部展开符合我们的要求吗?很明显在某些场景下是不符合的!我们用命名空间的目的是什么?是为了让我们的成员名不和其他人冲突或者和库内的函数名冲突,那全部展开就和没有一样,那再哪些场景下是可以的呢?再日常写代码练习的场景下是可以的,那对于使用频繁的函数,如cin、cout这些函数的时候,要一直加std::吗?这样会很麻烦,那有没有什么办法呢?这个时候就可以展开单个,具体操作如下:
using std::cin; using std::cout;
这个就是展开了单个,对于使用频繁的函数可以采用此方法。
如果再这个时候出现了两个名字相同的命名空间,编译器会怎么处理?
namespace test//空间名的名字 { int a; } namespace test { int a; }
报错是变量a重定义,而不是命名空间重定义,说明了,两个或者多个相同名字的命名空间会自动合并成一个。
这个再后面工作的项目当中是常见的,嵌套使用是可以的,可以将有部分作用一样的放在一起,当出错的时候,也可以直接定位到是哪个命名空间当中。
都看到这里了,留下你们的点赞+⭐收藏+评论吧