【C++】命名空间(namespace) 以及理解using namespace std

article/2025/10/6 16:29:06

命名空间

  • 1.命名空间使用的背景
    • 1.背景
  • 2.命名空间的定义(namespace)
    • 2.1正常的定义
    • 2.2 命名空间可以嵌套定义
    • 2.3允许命名空间相同
  • 3.域作用限定符(::)和命名空间的使用
    • 3.1域作用限定符(::)
    • 3.2 命名空间的使用
      • 3.2.1 加命名空间名词和域作用限定符
      • 3.2.2 使用using将命名空间中某个成员引入
      • 3.3 使用using namespace 命名空间名称 引入
  • 4.理解using namespace std以及为什么尽量使用局部展开
  • 5.总结

1.命名空间使用的背景

1.背景

我们先来看以下这段代码

#include <stdio.h>
#include <string.h>int strlen = 10;
int main()
{printf("%d", strlen);return 0;
}

这段代码会报以下错误:

“strlen”: 重定义;以前的定义是“函数”

意思就是说,我们定义的变量名strlen与string.h库的strlen函数名冲突了,因为同一个作用域里面不能有相同的名称,但是C语言没办法解决这种问题,所以C++中引入了命名空间这个概念。
其实还有一个原因就是当一个项目需要多个人写的时候,就难免会出现名称相同的情况,这时候如果是C语言我们对于这种问题只能要求程序员之间去修改名称,但是如果是C++的话,我们可以用命名空间,来允许多个名称相同的情况。

2.命名空间的定义(namespace)

定义命名空间,需要用到namespace关键字,然后加上一个命名空间的名字,最后花括号{}括起来即可

2.1正常的定义

namespace A   //A的命名空间
{int a = 20;int b = 30;...//也可以定义函数
}
namespace B //B的命名空间
{int a = 40;int b = 60;
}

2.2 命名空间可以嵌套定义

namespace N1
{int a;int b;int Add(int left, int right){return left + right;}
namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}

2.3允许命名空间相同

当多个命名空间相同时,实际上会合成一个命名空间。

3.域作用限定符(::)和命名空间的使用

3.1域作用限定符(::)

域作用限定符 ::
使用方式就是 作用域 ::变量名,如果作用域为空格则为在全局域中寻找变量。

//我们知道,当一个变量有在全局域中存在,也在局部中存在,会优先使用局部的变量。
//这时候如果我们就想用全局变量就要加上域作用限定符::
//如下:前面为空格表示全局变量。
int i = 20;//全局变量
int main()
{int i = 10;printf("%d", i);//局部变量,10printf("%d", ::i);//20return 0;
}

3.2 命名空间的使用

我们以下用命名空间的代码放在我们自己的test.h头文件中

namespace A  //A的命名空间
{int a = 20;int b = 30;
}
namespace B  //B的命名空间
{int a = 40;int b = 60;
}

在这里插入图片描述

3.2.1 加命名空间名词和域作用限定符

命名空间名称 + :: + 变量
#include "test.h"int main()
{printf("%d", A::a); //20printf("%d", B::a);// 40return 0;
}

3.2.2 使用using将命名空间中某个成员引入

这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。
#include "test.h"using A::a;
int main()
{printf("%d", a); //20printf("%d", B::a);// 40return 0;
}

3.3 使用using namespace 命名空间名称 引入

这种方式也叫全局展开,就是把命名空间中的所有变量在全局域中展开。
#include "test.h"using namespace A;
int main()
{printf("%d", a); //20printf("%d", b);//30printf("%d", B::a);// 40return 0;
}

4.理解using namespace std以及为什么尽量使用局部展开

由上面的知识我们可以知道,using namespace std,就是利用using 将 std 全局展开,而std就是我们的standard,就是C++标准库。
因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。 所以就有了和<iostream.h>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。 iostream和iostream.h,前者没有后缀。实际上,在你的编译器include文件夹里面可以看到,二者是两个文件。打开文件就会发现,里面的代码是不一样的。 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因 此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;命名空间std封装的是标准程序库的名称。

这是一段C++代码

写法1#include <iostream>using namespace std;//全局展开
int main()
{cout << "hello world" << endl;return 0;
}
写法2#include <iostream>using std::cout;//局部展开
using std::endl;
int main()
{cout << "hello world" << endl;return 0;
}
写法3#include <iostream>int main()
{std::cout << "hello world" << std::endl;//指定命名空间return 0;
}
在进行工程项目时,我们不建议将std全局展开,而是采用局部展开,或者指定命名空间访问。
之所以在进行工程项目时不建议将std全局展开,主要是为了防止命名冲突。
比如我正在使用两个库
using namespace A;
using namespace B;
不管是调用A里面的函数add(),还是B里面的函数sub(),都是可以的。
但是如果有一天,我的A库要升级的话,里边新加了一个函数叫sub,这样就出现问题了,因为它和命名空间B里的sub冲突了。那我是不是要一个一个去解决,费时费力。
如果我当初没有全局展开这些名称,而是A::add(),B::sub(),A::sub(),那就没有命名冲突的问题了。
所以不建议全局导入命名空间,而是要用哪个就显示哪个命名空间,这样代码本身的阅读性也好。

5.总结

命名空间namespace:定义方式namespace + {},正常定义,也可以嵌套定义(自然可以嵌套使用,如A::B::i),以及相同的名字的命名空间会合到一起。
using使用命名空间
域作用限定符::配合命名空间名称使用
三种使用命名空间方式:全局展开,局部展开,指定
最重要的是在进行工程项目时最好不要用全局展开,防止命名冲突,


http://chatgpt.dhexx.cn/article/iKmkKi0Z.shtml

相关文章

C++ namespace

C namespace 一、什么是 namespace1.1 C语言标识符作用域的缺陷1.2 namespace作用 二、namespace的定义2.1 命名空间可以嵌套定义小技巧 2.2 可定义重复的命名空间 三、namespace使用3.1 命名空间名称作用域限定符使用3.2 using将命名空间中成员引入3.3 使用using namespace将整…

Linux namespace概述

操作系统通过虚拟内存技术&#xff0c;使得每个用户进程都认为自己拥有所有的物理内存&#xff0c;这是操作系统对内存的虚拟化。操作系统通过分时调度系统&#xff0c;每个进程都能被【公平地】调度执行&#xff0c;即每个进程都能获取到CPU&#xff0c;使得每个进程都认为自己…

C++ | 你真的了解namespace吗?

文章目录 一、前言二、命名冲突三、命名空间1、域作用限定符2、命名空间的概念&#x1f449;示例1&#x1f449;示例2 3、命名空间的定义4、命名空间的使用① 指定命名空间访问【做项目】② 使用using部分展开【做项目】③ 使用using namespace全局展开【日常练习】 5、小结 解…

using namespace std 介绍

using namespace std&#xff1b; 首先我们要知道&#xff0c;这句代码的意思是&#xff1a;打开标准命名空间&#xff0c;即告诉编辑器我们将要使用名字空间std中的函数或者对象。 using 意思就是正在使用的意思。namespace 的引用是为了解决不同space中命名相同导致命名冲突…

Namespace基本知识

published: true tags: C author: persuez Namespace C中namespace简单来说就是用来控制标志符&#xff08;如变量&#xff0c;函数&#xff0c;类等&#xff09;的名字冲突的。 简单术语 declarative region: 指标志符声明的区域。具体见图一。 potential scope: 指从该标…

【C++】命名空间namespace详解

一、命名空间的引入 C中&#xff0c;名称(name)可以是符号常量、变量、宏、函数、结构体、枚举、类和对象等等。而在大型工程中&#xff0c;难免会有重名的现象&#xff0c;命名空间namespace&#xff0c;就是C引入的一种解决名称冲突的机制 1.1 如何解决命名冲突 C语言中 …

namespace介绍

命名空间 命名空间 namespace 1、::作用域运算符&#xff08;表明 数据、方法 的归属性问题&#xff09; 2、命名空间 namespace 解决命名冲突 2.1&#xff1a;namespace命名空间的定义 2.2:命名空间只能全局范围内定义&#xff08;以下错误写法&#xff09; 2.3:命名空间可嵌套…

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

一、为什么使用命名空间 考虑一种情况&#xff0c;当我们有两个同名的人&#xff0c;Zara&#xff0c;在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字&#xff0c;比如这个区域&#xff0c;如果它们生活在不同的区域或者它们的母亲或父亲的名…

Python中,线程threading详解

Python中最常用的同步有&#xff1a;锁/互斥&#xff0c;以及信号量。其中锁是最简单最低级的机制&#xff0c;信号量用于多线程竞争有限资源的情况。但是锁被释放&#xff0c;线程不一定被释放。 threading.Lock同步锁&#xff08;原语锁&#xff09; 通常使用获得锁&#xff…

【Python】多线程及threading模块介绍

​目录 1. 多线程简单介绍 2. threading模块介绍 2.1 threading模块常用方法 2.2 Thread类使用 2.2.1 使用构造函数传递可调用对象的方法创建线程 2.2.2 继承threading.Thread类 3. 多线程程序中使用(共享)全局变量 4. 多线程共享全局变量遇到的问题 5. 线程同步 5.1 …

threading库:Python线程的基础知识

目录 前言Thread对象区分线程守护线程自定义线程定时器线程线程间传送信号 前言 前面的subprocess库主要讲解的是进程知识与进程间的交互。而进程有可以拥有多个线程&#xff0c;所以threading库提供了管理多个线程执行的API&#xff0c;允许程序在同一个进程空间并发地运行多…

Python Threading 线程模块用法

一、什么是 Threading Threading用于提供线程相关的操作&#xff0c;线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组&#xff0c;线程也不能被停止、暂停、恢复、中断。 1.1、线程池图解 二、创建线程 导入模块threading&#xff0c;通过…

python中threading模块_python中threading模块详解

python中threading模块详解,threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。 下面来看threading模块的具体用法: 一、Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开…

python中的threading_python中threading的用法

threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。 下面来看threading模块的具体用法&#xff1a; 一、Thread的使用 目标函数可以实例化一个Thread对象&#xff0c;每个Thread对象代表着一个线程&#xff0c;可以通过start()方法…

Python--threading多线程总结

转载自&#xff1a;https://www.cnblogs.com/tkqasn/p/5700281.html threading用于提供线程相关的操作&#xff0c;线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组&#xff0c;线程也不能被停止、暂停、恢复、中断。 threading模块提供的类&…

Python 批量创建线程及threading.Thread类的常用函数及方法

在《【Python】线程的创建、执行、互斥、同步、销毁》&#xff08;点击打开链接&#xff09;中介绍了Python中线程的使用&#xff0c;但是里面线程的创建&#xff0c;使用了很原始的方式&#xff0c;一行代码创建一条。其实&#xff0c;Python里是可以批量创建线程的。利用Pyth…

功能强大的python包(十一):threading (多线程)

1.threading简介 threading库是python的线程模型&#xff0c;利用threading库我们可以轻松实现多线程任务。 2.进程与线程简介 通过上图&#xff0c;我们可以直观的总结出进程、线程及其之间的关系与特点&#xff1a; 进程是资源分配的最小单元&#xff0c;一个程序至少包含…

一文搞明白Python多线程编程:threading库

目录 前言一、基础知识1、并行和并发&#xff08;1&#xff09;定义&#xff08;2&#xff09;联系 2、进程和线程&#xff08;1&#xff09;定义&#xff08;2&#xff09;联系 3、全局解释器锁GIL 二、threading库1、线程的使用&#xff08;1&#xff09;普通创建方式&#x…

分块矩阵求逆(推导)

关于分块矩阵求逆&#xff0c;其中对角矩阵比较简单&#xff0c;我看很多人都写了&#xff0c;并且很详细。 但关于AUVD的分块矩阵我没看到太让我明白的&#xff0c;可能我get不到点&#xff0c;数学基础差&#xff0c;我就自己写了详细的步骤。 我写的这个条件是A可逆&#…

伴随矩阵求逆矩阵

在之前的文章《线性代数之矩阵》中已经介绍了一些关于矩阵的基本概念&#xff0c;本篇文章主要就求解逆矩阵进行进一步总结。 余子式(Minor) 我们先看例子来直观的理解什么是余子式(Minor&#xff0c;后边将都用英文Minor&#xff0c;中文的翻译较乱&#xff09;。 minor exa…