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

article/2025/10/6 16:25:17

一、命名空间的引入

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

1.1 如何解决命名冲突

C语言中

C语言中是通过人为操作符号名称、限制符号的作用域和链接属性来完解决名称冲突的。比如:

  1. 同一个C文件中的全局变量/函数加一个统一的前缀
  2. 通过作用域的掩蔽规则来进行覆盖(在大文件中如果出错很难发现)
  3. C文件中的全局变量和函数都是extern链接属性,可以用static将无需跨文件访问的全局变量和函数限制在内链接属性中

Cpp中

为实现命名空间机制,C++中引入了namespace关键字,定义格式为

namespace NAME
{/*符号定义*/
}

一个特定名称为NAME的命名空间的一对大括号内部定义的符号均被限制在该命名空间内,在命名空间内部各符号可以直接相互引用,而跨命名空间相互引用时必须同时指定被引用符号的命名空间名称。从某种意义上来说,命名空间就类似于一种前缀,本质上而言,就相当于控制了符号的作用域和链接属性。

二、namespace的使用

需要注意的是,命名空间不能定义在任何函数的内部,包括主函数,但是可以嵌套定义。

2.1 同一文件内常规使用namespace

namespace有三种使用方法:

  1. 使用时对符号附带命名空间的名称
  2. 使用前对该符号进行声明,后面直接使用该符号
  3. 使用前声明整个命名空间,后面对直接使用该命名空间中的任何符号
#include <iostream>namespace NM1
{int a = 1;int b = 2;
}void func1(void);using namespace std;//声明std命名空间,后面可以使用该命名空间中的任何符号,如cout、endl...
using NM1::a;       //声明命名空间NM1中的a,后面可以直接对a进行使用int main(void)
{cout << "the value of a is: " << a << endl;cout << "the value of b is: " ;cout << NM1::b;//使用变量时直接附带命名空间cout << endl;return 0;
}

2.2 命名空间内定义函数

我们可以在命名空间内直接定义函数,但是不能只声明不定义,否者链接时会出错

#include <iostream>namespace NM1
{using namespace std;void func1(void){cout << "Func1 in NM1" << endl;}void func2(void){func1();}
}using namespace NM1;int main(void)
{func1();func2();return 0;
}

这是合法的使用
clipboard_20200214030329.png

如果我们只声明,而在默认命名空间(后文会阐述)中去定义,如下所示:

#include <iostream>namespace NM1
{void func1(void);
}using namespace NM1;int main(void)
{func1();return 0;
}void func1(void)
{std::cout << "Func1 in NM1" << std::endl;
}

则会出现链接错误,因为func1在定义和声明时不再同一个作用域
clipboard_20200214030932.png

2.3 嵌套使用命名空间

这个东西也很简单,如下测试代码

#include <iostream>namespace NEST1
{using namespace std;void func1(void){cout << "Func1 in NEST1" << endl;}namespace NEST2{void func2(void){cout << "Func2 in NEST1::NEST2" << endl;}}
}int main(void)
{NEST1::func1();NEST1::NEST2::func2();return 0;
}

clipboard_20200214032209.png

2.4 跨文件使用namespace

建立相应的测试文件

touch external_test.cpp external_test.h main.cpp CMakeLists.txt

对应的内容如下:

external_test.h

#ifndef CPP_EXTERNAL_TEST_H_
#define CPP_EXTERNAL_TEST_H_namespace EX1
{void func(void);
}#endif

external_test.cpp

#include "external_test.h"
#include <iostream>namespace EX1
{   using namespace std;void func(void){cout << "Func in EX1" << endl;}
}

main.cpp

#include "external_test.h"using namespace EX1;int main(void)
{func();return 0;
}

测试结果如下,EX1成功跨文件调用
clipboard_20200214042524.png
在正规场合都是通过头文件的包含来进行namespace的跨文件调用,有时也可以通过对命名空间内的符号进行extern全局声明

建立相应的测试文件

touch external_test.cpp main.cpp CMakeLists.txt

相应内容如下:

extern_test.cpp中:

#include <iostream>namespace EX1
{   using namespace std;void func(void){cout << "Func in EX1" << endl;}
}

main.cpp

namespace EX1
{   extern void func(void);
}using namespace EX1;int main(void)
{func();return 0;
}

clipboard_20200214044616.png

三、一些特殊的命名空间

3.1 std命名空间

标准C++库的所有的标识符(函数、类、模板等)是在一个名为std的命名空间中定义的,stdstandard(标准)的缩写,表示这是存放标准库的有关内容的命名空间。

3.2 默认命名空间

默认命名空间又叫全局命名空间,就是除了其他的命名空间之外的部分,比如说我们的主函数就是在默认命名空间中的,在其他命名空间引用默认命名空间中的符号的方法有两种:

  1. 直接使用
  2. 在符号前加::

3.3 匿名命名空间

匿名命名空间就是没有名字的命名空间,定义如下:

namespace
{/*符号*/
}

匿名命名空间中的符号纯本空间内部使用,不能被外部引用,效果类似于全局变量和函数加static,但是比C中的static使用范围广


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

相关文章

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…

矩阵的逆

矩阵的逆 原理&#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,如果存在一…

Maple矩阵求逆

如何使用Maple进行矩阵求逆 调用包 with(LineAlgebra);输入我想要的矩阵&#xff1a; R : Matrix([[cos(a), sin(a), 0], [-sin(a), cos(a), 0], [0, 0, 1]]);然后我使用了Inverse命令 simplify(Inverse(R));结果并没有生成矩阵的逆。 查了一下说明手册加上mod好像也不行&a…