IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C++基础] 命名空间namespace的了解和使用 -> 正文阅读

[C++知识库][C++基础] 命名空间namespace的了解和使用

命名空间 namespace

#include<iostream>

int rand = 0;

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

上述代码一定会出现以下情况:
在这里插入图片描述
原因: 自己定义的rand变量为某一库函数里面已经声明过的函数,意思就是你自己定义的东西跟库函数的东西重复了。这种错误就是命名冲突

命名冲突问题:

  1. 我们自己定义的变量、函数可能跟库里面重名冲突。
  2. 进入公司项目组后,做的项目通常比较大,多人协作,可能命名冲突。
    C语言没有办法很好的解决这个问题。
    C++提出了一个新语法:命名空间

命名空间的定义

对于上面的问题我们使用命名空间来解决:

#include<iostream>

namespace zzy
{
	int rand = 0;
}

int main()
{
	printf("%d", zzy::rand);
	
	return 0;
}

我们使用namespace来划定一个区域,叫做,域的名字叫zzy(名字可以自己定义,但是最好不要跟库已有的重复)。这个域就像是隐身衣一样,让系统编译的时候不会去这个区域里面读取。

:: 为域作用限定符,前面是命名空间的名称,后面是命名空间里的变量、类型、函数等。使用这个限定符来指定我们使用的是哪个命名空间里的变量

需要注意的一点是,命名空间是全局的,必须要写在main函数的外边。

下面举些例子来帮大家更清晰的了解命名空间:
1. 函数定义在命名空间里

#include<iostream>
namespace zzy
{
	int Add(int x, int y)
	{
		return x + y;
	}
}

int main()
{
	printf("%d\n", zzy::Add(1, 2));
	return 0;
}

如果把函数的定义写在命名空间的外面,而函数声明在命名空间里面会怎么样?由于命名空间会屏蔽掉,相当于你没有写这个声明。但是如果你的函数定义写在main函数的上面就没什么问题了。

#include<iostream>
namespace zzy
{

	int Add(int x, int y);
}

int Add(int x,int y)
{
	return x+y;
}

int main()
{
	printf("%d\n",/*zzy::*/Add(1, 2));
	return 0;
}

一点要注意,这个时候你不可以写zzy::了,因为如果你这么写的话系统会优先去zzy命名空间里去寻找,发现只有函数的声明,没有函数的定义,所以是没结果的。

2.对全局变量使用命名空间

#include <iostream>
int a = 0;

int main()
{
	int a = 10;
	printf("%d",::a);//使用全局作用域的a,::前面的没有东西代表全局作用域
}

3.命名空间的嵌套

#include <iostream>
namespace zzy
{
	int a = 10;
	namespace N1
	{
		int b = 20;
	}
}

int main()
{
	printf("%d\n",zzy::a);
	printf("%d\n",zzy::N1::b);
}

4.using命名空间
我们发现,每次使用一些命名空间里的变量总是要加上”命名空间名称::”,当变量多时,就会显得很繁琐。所以我们可以这么做:

#include <iostream>
using namespace zzy
{
	int count = 12;
	int Add(int x,int y)
	{
		return x+y;
	}
}

//解放了整个zzy空间,使里面的变量等变得不隐身了
using namespace zzy;

int main()
{
	printf("%d",count);
	printf("%d",Add(1,2));
}

也可以解放一部分变量、函数等:

#include <iostream>
using namespace zzy
{
	int count = 12;
	void B()
	{
		int cur = 0;
	}
}

//只解放了一部分变量
using zzy::B::cur;

int main()
{
	printf("%d",zzy::count);
	printf("%d",cur);
}

5.命名空间里的结构体

#include <iostream>

using namespace zzy
{
	int count = 0;
	struct Node
	{
		int val = 0;
	};
}

int main()
{
	struct zzy::Node node;//注意::的位置,我们要找的是Node
	node.val = 12;
	printf("%d\n", node.val);
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:41:10  更:2021-11-26 08:41:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:51:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码