C++ namespace命名空间解析

 更新时间:2021年11月25日 10:01:08   作者:zhaozhenyu123  
考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如它们生活在不同的区域或者兴趣爱好什么的,在C++程序中也会遇到同样的情况,所以命名空间就此产生

命名空间 namespace

#include<iostream>

int rand = 0;

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

上述代码一定会出现以下情况:

原因: 自己定义的rand变量为某一库函数里面已经声明过的函数,意思就是你自己定义的东西跟库函数的东西重复了。这种错误就是命名冲突。

命名冲突问题:

  • 我们自己定义的变量、函数可能跟库里面重名冲突。
  • 进入公司项目组后,做的项目通常比较大,多人协作,可能命名冲突。

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++ namespace命名空间解析的文章就介绍到这了,更多相关C++ 命名空间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现LeetCode(59.螺旋矩阵之二)

    C++实现LeetCode(59.螺旋矩阵之二)

    这篇文章主要介绍了C++实现LeetCode(59.螺旋矩阵之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 浅谈C++的几种从键盘输入方式

    浅谈C++的几种从键盘输入方式

    今天小编就为大家分享一篇浅谈C++的几种从键盘输入方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 使用C语言提取子字符串及判断对称子字符串最大长度

    使用C语言提取子字符串及判断对称子字符串最大长度

    这篇文章主要介绍了使用C语言提取子字符串及判断对称子字符串最大长度,文后附送了一道ACM竞赛题目,需要的朋友可以参考下
    2015-08-08
  • C语言实现简易通讯录完整流程

    C语言实现简易通讯录完整流程

    这篇文章主要为大家介绍了C语言实现简易通讯录的完整流程,每个环节都有完整代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • C语言 文件的随机读写详解及示例代码

    C语言 文件的随机读写详解及示例代码

    本文主要介绍C语言 文件的随机读写,这里整理了相关资料及示例代码以便大家学习参考,学习此部分内容的朋友可以参考下
    2016-08-08
  • C++文件的操作及小实验示例代码详解

    C++文件的操作及小实验示例代码详解

    这篇文章主要介绍了C++文件的操作及小实验,对于文件,它是一个流对象,对文件的操作无非是读和写,通过本文的学习大家将会理解文件的具体操作
    2022-05-05
  • C语言中预处理命令的使用

    C语言中预处理命令的使用

    C语言预处理是编程中非常重要的一个环节,通过预处理指令和预处理器的一些特性,本文主要介绍了C语言中预处理命令的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • QT实现用户登录注册

    QT实现用户登录注册

    这篇文章主要为大家详细介绍了QT实现用户登录注册,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • vscode使用cmake时将命令行参数传递给调试目标的方法

    vscode使用cmake时将命令行参数传递给调试目标的方法

    这篇文章主要介绍了vscode使用cmake时将命令行参数传递给调试目标,下面介绍了一个示例,将参数first_arg, second-arg和third arg传递给程序(此处需要注意,third arg中间虽然存在空格,但是仍然被视作一个参数),需要的朋友参考下吧
    2024-03-03
  • C语言重难点之内存对齐和位段

    C语言重难点之内存对齐和位段

    这篇文章主要介绍了C语言重难点之内存对齐和位段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论