当前位置:   article > 正文

【C++入门】命名空间详解——解决的问题、使用方法、和C语言对比_全局空间和命名空间 c++

全局空间和命名空间 c++

1、函数、变量重名问题

(1)在大型项目中,程序是由多名程序员进行开发,将项目拆分成模块后,定义好模块间的交互接口,然后每个程序员彼此相对独立的开发自己负责模块;
(2)程序员在定义函数和变量时,并不知道其他人会如何命名,所以难免会造成同名的现象,而在链接程序时是根据变量名或者函数名进行链接,如果有相同名字的变量或者函数则无法区分,链接就会报错;

2、C语言解决重名问题

(1)如果不对外提供的函数接口,则用static关键字修饰,将作用域限制在本文件中,这样就算其他库有同名函数或者变量也不会冲突,因为作用域没有交集。参考博客:https://blog.csdn.net/weixin_42031299/article/details/115587119;
(2)函数的命名添加前缀,前缀则根据模块的名字决定,比如初始化函数:串口初始化uart_init()、内存初始化memory_init();
总结:上面的方法是可以避免函数重名问题的,毕竟linux内核都是用C语言写的;但是避免重名的工作都必须由程序员负责,如果程序员不按规矩命名则会有问题;

3、C++引入命名空间解决重名问题

(1)C++是在C语言的基础上发展而来,既然C语言开发时已经意识到函数重名问题,在设计C++语言时就专门引入命名空间的机制来避免函数重名问题;
(2)命令空间的思想和我们的身份证命名类似,就是从大范围到小范围去定位函数。函数重名类比人的名字重名(比如都叫张三),用命名空间去描述相同的人,就是将同名的函数划分到不同的命名空间;比如一个是北京市的张三,一个是重庆市的张三,虽然同名,但是一个属于北京一个属于重庆。北京和重庆就可以类比成两个命名空间;

4、命名空间的创建

4.1、namespace关键字

namespace  命名空间名字{
	//空间内容
};
  • 1
  • 2
  • 3

(1)namespace关键字标明这是一个命名空间;
(2)命名空间的名字在后续引用命名空间时会用到,但是命名空间的名字并不是必须的,如果省略名字就叫做匿名空间;
(3)命令空间内可以定义函数、变量类型等,相同命名空间内的函数、变量可以互相调用;

4.2、同个命名空间的多次申明

namespace NS
{
    int i;
}
 
//...
namespace NS
{
    int j;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(1)相同的空间名称是可以被多次声明的,这种声明向相互补充的。这就使得命名空间可以被分割到几个文件中甚至是同一个文件的不同地方中;
(2)比如上面的NS命名空间,两次声明后,NS命名空间包含i、j两个int型变量;

4.3、命名空间的嵌套

namespace NS1
{
    int i;
	
	namespace NS2
	{
		int j;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

上面在NS1命名空间中又定义了NS2命名空间;

5、命名空间的引用

5.1、引用整个命名空间

#include <iostream>

using namespace std;


namespace NS1
{
	int a;
    int i;
	
	namespace NS2
	{
		int b;
		int j;
	}
}

//引用NS1整个命名空间
using namespace NS1;

//引用NS2命名空间
using namespace NS1::NS2;

int main()
{
	i = 1;
	
	j = 2;
	
	cout << "i=" << i << "j=" << j << endl;
	

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

(1)在用using关键字引用整个命名空间后,命名空间内的函数、变量都可以直接调用;
(2)对于嵌套的命名空间,引用时要逐个引用,并不是引用最外层的命令空间就会自动引用嵌套的命名空间;

5.3、引用命名空间的部分函数/变量

#include <iostream>

using namespace std;


namespace NS1
{
	int a;
    int i;
	
	namespace NS2
	{
		int b;
		int j;
	}
}

//引用NS1命名空间的变量a
using  NS1::a;

//引用NS2命名空间的变量j
using NS1::NS2::j;

int main()
{
	a = 1;
	
	//在使用变量时指明变量所在命名空间
	NS1::i = 2;
	
	j = 2;
	
	cout << "i=" << NS1::i << "j=" << j << endl;
	

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

(1)第一种引用方法是在函数之外去引用命名空间的变量,这样在之后使用变量时就不用在指明变量所在命名空间;
(2)在每次使用变量时都指定命名空间;

6、特殊命名空间

6.1、全局命名空间

(1)全局命名空间又叫默认命名空间,如果没有明确指明函数/变量的命名空间,那就是处在全局命名空间,比如我们定义的main函数;
(2)全局命名空间是不能直接调用其他命名空间的函数的,必须使用using关键字引用其他命名空间后才能调用;

6.2、匿名命名空间

namespace
{
	int a;
    int i;
}
  • 1
  • 2
  • 3
  • 4
  • 5

(1)匿名命名空间就是省略了名字的命名空间,写代码时把不需要对文件外提供的函数、变量都声明在匿名命名空间内;
(2)经过前面的介绍,我们知道引用其他命名空间的函数是通过命名空间的名字,那匿名空间根本就没有名字,所在在其他文件中是无法引用匿名空间的函数;
(3)匿名空间的函数作用域只在定义的文件中,作用相当于C语言的static关键字;

6.3、std命名空间

#include <iostream>

using namespace std;

int main()
{
	cout << "hello word!\n" << endl;

	//如果不引用std命名空间,则要明确指明命名空间
	//std::cout << "hello word!\n" << std::endl;

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(1)标准C++把自己的整个库定义在std命名空间中。比如我们常用的cout、cin就定义在std命名空间中,我们写代码一般都会引用std命名空间;
(2)想进一步了解std命名空间,可以去查看C++库的头文件;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/439692
推荐阅读
相关标签
  

闽ICP备14008679号