【C++】命名空间(namespace)

10 篇文章 0 订阅
本文介绍了C++中的命名空间,解释了其目的和使用方式,包括解决命名冲突、作用域限定符的应用以及注意事项,如命名空间规范和重定义问题。
摘要由CSDN通过智能技术生成

1. 为什么要有命名空间?

  在C语言中,局部变量和全局变量如果同名,在使用时可能会造成冲突。这并不是想避免就能避免的,在程序中,不仅仅是变量,函数也大量存在,所以存在许多命名冲突的问题。特别是一个项目,如果由一个开发团队进行开发,团队中存在多名开发成员,这样的命名冲突问题就更多了。

#include <stdio.h>

int val = 10;

int main() {
	int val = 20;
	printf("%d\n", val);
	return 0;
}

  上面这段C代码,在main()函数中,不删除不注释掉局部变量val情况下,如果就想要访问全局变量val,这是无法做到的。这就是命名冲突引起的问题,也导致C语言在这方面不够灵活。

2. 命名空间介绍

  而C++中使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。如何更好地理解这段话呢?请看下面代码例子:

#include <stdio.h>
#include <stdlib.h>

int rand = 10;

int main() {
	printf("%d\n", rand);
	return 0;
}

这段程序实际上无法运行,就不说运行,因为这甚至不能编译过去,看报错信息就知道了:
在这里插入图片描述
因为在C语言标准库stdlib.h中,rand是一个函数!这个例子就更明显是命名冲突引发的问题了,不过这一个问题倒是可以解决,就是把变量rand放在main()函数局部定义,就可以使用了。虽然可以解决,但不能否认存在这样一个问题。

这时就可以使用命名空间解决这个问题了,当然这也只能是将C代码改成C++才支持。

#include <iostream>

namespace test {
	int rand = 10;
}

using namespace std;
using namespace test;

int main() {
	cout << test::rand << endl;
	return 0;
}

3.命名空间三种使用方式

  1. 命名空间 + ::(::是作用域限定符)
#include <iostream>

namespace test {
	int rand = 10;
}

int main() {
	std::cout << test::rand << std::endl;
	return 0;
}
  1. using + 命名空间::成员
#include <iostream>

namespace test {
	int rand = 10;
}

using std::cout;
using std::endl;
using test::rand;

int main() {
	cout << rand << endl;
	return 0;
}
  1. using namespace 命名空间
#include <iostream>

namespace test {
	int rand = 10;
}

using namespace std;

int main() {
	cout << test::rand << endl;
	return 0;
}

为什么有这几种用法呢?对于某些情况,需要指定命名空间,否则编译器无法区分它究竟是指哪里的。比如下面的rand,这里能看出来,编译器将其当成了stdlib.h中的rand函数。
在这里插入图片描述
再看下面这种情况,我引入了命名空间test,这时就混淆了命名空间test中的rand和标准库中的rand,所以还是得给rand指定一下:test::rand或std::rand
在这里插入图片描述

4. 注意

  通过上面的介绍了解后,命名空间确实可以解决命名空间问题,当然前提是使用规范,比如在多个命名空间中如果有一样名字的变量,那么这几个命名空间的的名字不能一样,这样不仅会造成重定义,同时也完全打破了命名空间的用途了。另外在自定义命名空间中不仅仅只是定义变量,也可以定义函数、宏等。
在这里插入图片描述
在这里插入图片描述

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念来过倒字名qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值