Namespace基本知识

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

published: true
tags:

  • C++
    author: persuez

Namespace

C++中namespace简单来说就是用来控制标志符(如变量,函数,类等)的名字冲突的。

简单术语

  • declarative region: 指标志符声明的区域。具体见图一。
    declarative region.jpg
  • potential scope: 指从该标志符的声明点到其declarative region的终点。也就是一个标志符的最大可能作用域。具体见图二。
  • scope: 指标志符的可见区域。具体见图二。
    potential scope.jpg

namespace关键字

C++中namespace关键字定义了一个declarative region,所以在一个namespace中声明的标志符和其他namespace中声明的同名标志符是没有名字冲突的。

基本语法

我们定义两个namespace,分别命名为Jack和Jill,如下:

// ns.hpp
namespace Jack {double pail; // variable declarationvoid fetch(); // function prototypeint pal; // variable declarationstruct Well { ... }; // structure declaration
}namespace Jill {double bucket(double n) { ... } // function definitiondouble fetch; // variable declarationint pal; // variable declarationstruct Hill { ... }; // structure declaration
}

namespace 可以定义在全局范围内,也可以嵌套在其他namespace中。如果namespace中声明了一些函数或成员函数,那么我们可以通过以下语法定义函数:

// ns.cpp
namespace Jack {void fetch(){...}
}

访问namespace中的成员

除了一般的作用域运算符(::)直接访问namespace中的成员外,我们还有两种方法可以帮助我们轻松地多次访问namespace中的成员:

  • using declaration
  • using directive
    简单来说,前者可以让我们访问特定的成员,而后者则可以让我们访问整个namespace。下面就具体介绍两种方法:

using declaration

这是书本推荐的访问方法。using declaration 将访问的成员加入到它出现的declarative region中。具体用法直接看例子,注释也在样例中:

namespace Jill {double bucket(double n) { ... }double fetch;struct Hill { ... };
}char fetch; // global variableint main()
{using Jill::fetch; // 一个 using declaration; 它将fetch放到了当前的block declarative region,相当于声明了一个局部变量fetchdouble fetch; // 这将发生错误!因为上条语句已经相当于声明了一个局部变量fetchcin >> fetch; // 读入Jill::fetchcin >> ::fetch; // 读入全局的fetch...
}

这里需要注意的是using declaration 如果访问的是函数void fetch(),那么语法如下:using Jack::fetch。注意,我们并没有指定函数的返回类型,参数信息,唯一指定的就是函数名,所以using declaration会把该函数的所有重载类型(如果有)都引用进来。

using directive

using directive 将使namespace中的所有成员可访问。如我们平常用的using namespace std;就是一个using directive。我们可以将using directive放在任何地方,但这也会造成它的可以使用的范围不同,但注意使用范围并不代表scope或者potential scope,这个可以从下面的例子看到。和using declaration的另外一个大的不同地方是当它在局部使用时,声明相同的局部变量不会报错,而是声明的局部变量会覆盖掉namespace中的成员。如:

namespace Jill {double bucket(double n) { ... }double fetch;struct Hill { ... };
}char fetch; // global variableint main()
{using namespace Jill; // Jill::fetch没有局部作用域,因为它没有覆盖掉全局的fetch,并且还可以声明一个局部的fetch,所以作用范围和作用域是不同的。Hill Thrill;double water = bucket(2); // use Jill::bucketdouble fetch; // 注意:这里不会出现错误,而是覆盖了Jill::fetchcin >> fetch; // 读入局部的fetchcin >> Jill::fetch; // 读入Jill的fetchcin >> ::fetch; // 读入全局fetch
}int foom()
{Hill top; // 出错!Jill::Hill top; // 正确
}

用using declaration 还是 using directive

一般来说,using declaration比using directive 安全。因为

  • using declaration明确的告诉我们可以用哪个成员。
  • using diclaration 如果名字冲突了,编译器会报错;而using directive会覆盖了namespace的版本,而不做任何提示。

namespace 嵌套

基本语法如下:

namespace elements {namespace fire {int flame;...}float water;
}
// 可以访问fire用
using namespace elements::fire;namespace myth {using Jill::fetch;using namespace elements;using std::cout;using std::cin;
}
int main()
{std::cin >> myth::fetch;// 或者std::cin >> Jill::fetch;// 访问 elementsusing namespace myth; // using namespace myth; using namespace elements;这两条语句和上面一条是等价的}

别名

namespace可以有别名。可以用来简化嵌套namespace的使用:

namespace MEF = myth::elements::fire;
using MEF::flame;

Unnamed namespace

基本语法如下:

namespace {int ice;int bandycoot;
}

它有以下特点:

  • Unnamed namespace 就像在其前面用了using directive一样,我们可以直接访问其成员。
  • 因为其没有名字,所以只能在当前定义的文件中使用。也就是说,这个提供了一种类似关键字static的能力,只能在内部链接。

公众号

更多好玩的内容请关注我的公众号~会介绍一些 linux 上的效率工具,C 语言, linux 咨询以及 linux 内核源码学习。


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

相关文章

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

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

namespace介绍

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

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

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

Python中,线程threading详解

Python中最常用的同步有:锁/互斥,以及信号量。其中锁是最简单最低级的机制,信号量用于多线程竞争有限资源的情况。但是锁被释放,线程不一定被释放。 threading.Lock同步锁(原语锁) 通常使用获得锁&#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库主要讲解的是进程知识与进程间的交互。而进程有可以拥有多个线程,所以threading库提供了管理多个线程执行的API,允许程序在同一个进程空间并发地运行多…

Python Threading 线程模块用法

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

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

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

python中的threading_python中threading的用法

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

Python--threading多线程总结

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

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

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

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

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

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

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

分块矩阵求逆(推导)

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

伴随矩阵求逆矩阵

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

矩阵的逆

矩阵的逆 原理&#xff1a; 连接&#xff1a; https://baike.baidu.com/item/%E9%80%86%E7%9F%A9%E9%98%B5 代码&#xff1a; QT c版&#xff1a; //求逆矩阵 QVector<QVector<double>> Matrix_inverse(QVector<QVector<double>> &A) {int …

矩阵求逆

矩阵求逆 初等变换求逆参考文章 初等变换求逆 1&#xff09;初等变换求逆矩阵时不能同时使用初等列变换和初等行变换&#xff0c;使用初等列变换或者初等行变换来求逆矩阵都是可以的&#xff0c;但是不能二者同时使用&#xff0c;只能用一种方法来得到逆矩阵。 2&#xff09;初…

卡西欧计算器矩阵求逆

记录一下&#xff0c;防止忘记 1 按开机键 打开计算器 2 按 菜单设置键 进去计算模式选择模块 3 按“ 4 ”选择矩阵运算 4 有四个矩阵可以编辑 选择按 4 编辑矩阵D 5 输入矩阵的行数 我按了3 6 输入矩阵的列数 我按了 3 7 建了一个3*3空矩阵 输入第一个数 12 然后按“”键完…

如何用计算机求矩阵的逆矩阵,逆矩阵的求法

逆矩阵是数学知识的一种&#xff0c;很多学习数学的同学们应该很了解吧。逆矩阵计算器是一款可以对矩阵的逆进行计算的免费程序,本程序引入了分数算法,可以对分数元素计算并得出分数结果。那么这款软件怎么样呢&#xff1f;接下来&#xff0c;介绍一下。 逆矩阵的求法 A^(-1)(1…

python求逆矩阵的方法,Python 如何求矩阵的逆

我就废话不多说了,大家还是直接看代码吧~ import numpy as np kernel = np.array([1, 1, 1, 2]).reshape((2, 2)) print(kernel) print(np.linalg.inv(kernel)) 注意,Singular matrix奇异矩阵不可求逆 补充:python+numpy中矩阵的逆和伪逆的区别 定义: 对于矩阵A,如果存在一…