【C++】1. 命名空间

MFC实现图书管理系统(附完整源码) 阅读详情


一、命名空间的由来

当我们使用c语言编写项目时,可能遇到以下情况:

  1. 变量名与某个库函数名重复,导致保错。这种情况一般是自己不知道引用的头文件包含哪些库函数。

在这里插入图片描述
2. 和队友一起编写项目时,自己使用的标识符和队友的标识符名字一样,导致代码整合时发生错误。这种情况很难避免,毕竟一些常用的命名习惯是大家都有的,那这个时候怎么办呢?总不能打一架来争夺命名权。
在这里插入图片描述
基于这样的问题,c++的创造者创造了命名空间。

当多个库或代码文件被组合在一起时,可能会出现相同名称的变量、函数、类等,这种情况称为“命名冲突”。命名空间可以在不改变原有代码的情况下,将标识符放在特定的作用域中,以避免命名冲突。


二、命名空间的使用

上面提到,命名空间通过将标识符放在特定的作用域来解决命名冲突。这里出现一个名词:作用域。学过c语言的人应该都知道这个概念。

作用域是指在程序代码中,标识符有效的区域或范围。在作用域内,标识符可以被使用或修改,而在其它作用域内则可能无法访问该标识符。

变量只有在它的作用域里才能发挥它的作用。局部变量只能在局部域发挥作用,全局变量只有在全局域才能发挥作用。
由于作用域的存在,请问以下代码会发生命名冲突吗?
在这里插入图片描述
不会!因为两个a不在同一个域中。
编译器在使用a这个标识符时,一般按照以下顺序去寻找a:局部域->全局域。


因此我们按照这样的思路,来创建一个命名空间域存放我们设置的标识符。

2.1 关键字:namespace

namespace的使用如下:
在这里插入图片描述
此时sfw里的a就不会与sfw域外面的a产生冲突。
命名空间内部可以包含结构体,函数……


2.2 访问命名空间里的标识符

上面提到编译器查找标识符的顺序是 :局部域->全局域。
现在我们创建了sfw这个命名空间,那编译器此时访问顺序会变成什么?不变,因为编译器不会主动去访问命名空间里的内容。
在这里插入图片描述
那我们怎么访问命名空间里的标识符呢?有三种方法。

  1. 展开命名空间:通过使用using这个关键字,如下图
    在这里插入图片描述
    注意:展开命名空间相当于把这个命名空间暴露在全局域当中。
    这就意味着:如果此时全局域有一个标识符和sfw命名空间里一个标识符相同,则会发生命名冲突。如下图,因此不推荐这种玩法。
    在这里插入图片描述
    补:using namespace sfw;需要在sfw这个命名空间创建后才能使用,如果这句代码在namespace sfw {……}上面,则会报错

  1. 使用作用域限定符::来访问命名空间里的标识符 : 命名空间名字+::+标识符,如下图
    在这里插入图片描述
    这种方式就不用担心展开命名空间造成的错误了,因此这种方式往往是大型团队项目的使用方式。

  1. 展开命名空间的某一部分:using + namespace + 命名空间的名字 + :: + 标识符
    在这里插入图片描述
    这种方式仍有展开命名空间相同的错误,比如此时刚好有个全局变量是a,一样也会报错。个人还是推荐第二种方式。

2.3 命名空间的特点

我们已经知道了如何创建和访问命名空间,下面我们来学习命名空间的一些特点。

  1. 命名空间的嵌套:一个命名空间可以包含另一个一个命名空间
    在这里插入图片描述

  2. 命名空间的合并
    请问:命名空间会发生命名冲突吗?即我创建了一个命名空间:sfw,你也创建了一个命名空间:sfw。
    答:冲了但也没冲。编译器会将相同名字的命名空间合在一起,如果这两个命名空间都定义了相同的标识符,则发生冲突。
    在这里插入图片描述


全局命名空间

在 C++ 中,:: 表示全局命名空间。::testing::Test 的写法确保访问的是全局命名空间下的 testing,而不会受到当前作用域内的命名空间或类的影响。这种写法通常用于避免命名冲突或保证代码在不同命名空间下依然可以正确访问 testing::Test。

为什么加上 ::

在 Google Test 的代码中,加上 :: 可以防止可能的命名冲突。例如:

namespace mynamespace {
    void testing() {}  // 一个与 testing 同名的函数

    class MyTest : public ::testing::Test { // 使用全局的 testing::Test
        // 测试代码
    };
}

在这个例子中,如果没有 ::,编译器可能会认为 testing::Test 是 mynamespace::testing::Test,而不是全局的 testing::Test,导致编译错误。加上 :: 后,即使在命名空间内也可以确保访问的是全局的 testing::Test。

三、总结

命名空间是C++中用来避免命名冲突的一种机制。创建和使用命名空间的方法如下:

创建命名空间:在全局或其他命名空间的作用域内,使用关键字namespace加上命名空间的名称来创建一个命名空间,例如:

namespace my_namespace {
   // 命名空间的定义内容
}

命名空间中可以定义变量、函数、类等标识符,并给他们都加上该命名空间的前缀。例如:

namespace my_namespace {
    int my_var = 0;  // 定义命名空间内的变量
    void my_function() {  // 定义命名空间内的函数
        // 函数代码
    }
    class MyClass {  // 定义命名空间内的类
        // 类定义
    };
}

使用命名空间:在使用命名空间内的标识符时,需要在其前面加上命名空间的名称和作用域限定符(::),例如:

my_namespace::my_var = 100;   // 使用 my_namespace 命名空间内的变量
my_namespace::my_function();  // 调用 my_namespace 命名空间内的函数
my_namespace::MyClass obj;    // 使用 my_namespace 命名空间内的类

可以使用using关键字引入命名空间中的标识符,使得在该作用域内可以直接使用该标识符而不需要加上命名空间前缀。例如:

using my_namespace::my_var;
my_var = 100;   // 直接使用 my_var,无需加上命名空间前缀

命名空间的使用可以避免不同模块或工程中使用同名标识符导致的冲突问题,同时也便于代码维护和阅读。

【CASS精品教程】035:南方CASS7.1台阶画法案例大全 摘要:本文详细介绍了南方CASS7.1软件中5种台阶工具的使用方法,包括普通台阶、有边台阶、L型台阶、U型台阶和不规则台阶。重点说明各类台阶的绘制步骤和注意事项,如绘制方向(从右下角逆时针连接4个点)、台阶方向标识(白色边为下边)、台阶数自动生成不可更改等特性。同时指出高版本CASS可能存在操作差异,并配以多张示意图直观展示各类台阶的绘制过程和效果,为使用CASS7.1绘制建筑台阶提供了实用指导。(148字) 阅读详情

相关推荐

(nginx) nginx5 nginx https部署实战

综上所述,相比 HTTP 协议,HTTPS 协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全。所以在这个互联网膨胀的时代,其中隐藏着各种看不见的危机,为了保证数据的安全,维护网络稳定,建议大家多多推广HTTPS。SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐HTTPS 降低用户访问速度(多次握手)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)

weixin_50382197的博客 1505

【C++】命名空间的使用

C++命名空间的使用

阿润菜菜的博客 1366

Mujoco xml actuator

在MuJoCo中,actuator(执行器) 是用于定义外部力或力矩的机制,这些力或力矩可以作用于关节、肌腱或身体。执行器可以模拟各种类型的驱动器,如电机、液压缸、肌肉等。它们通过定义传输(transmission)和力生成机制(force generation)来实现对模型的控制。

m0_52113469的博客 2896

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

命名空间(英语:Namespace),也称命名空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。

tang20030306的博客 1万+

STM8库函数开发手册(3) //UART1、内部EEPROM、FLASH操作库、IIC(硬、软)

STM8S 微控制器家族的通用同步异步收发器(UART1,UART2 或者UART3)提供了一种灵活的方法与使用工业标准NRZ 异步串行数据格式的外部设备之间进行全双工数据交换。STM8 的UART 提供范围的波特率选择,并且支持多处理器通讯。UART 也支持LIN(局部互联网)协议版本1.3,2.0,和2.1 以及在主模式下的J2602。 UART1 和UAR...

finedayforu的博客 2520

Profinet从站开发初体验:用p-net开源库和树莓派快速搭建一个IO设备模拟器

本文详细介绍了如何使用p-net开源库和树莓派快速搭建Profinet从站IO设备模拟器。从开发环境准备、p-net源码编译到设备模拟器功能实现,提供了全流程实战指南,帮助开发者快速掌握工业通信协议开发技巧,适用于工业自动化领域的设备互联测试与验证。

weixin_30384217的博客 383

【C++入门】命名空间的定义与使用

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数、类的名称如果都存在于全局作用域中,可能会导致很多冲突。 **使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。

大米饭的记录册 2231

基于yolo11的BGA图像目标检测

15.YOLOv8的n/s版本(如YOLOv8n-1280),或通过TensorRT量化压缩模型。3.使用自适应batch_size(如根据GPU显存动态调整),推荐16-32。为采集分辨率整数倍(如原图2592×1944,训练时缩放为640×480),保持宽高比。14.采用余弦退火学习率(cos_lr)和早停(patience=50),防止过拟合。1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验。13.部署模型后持续收集困难样本(如模棱两可的预测结果),定期迭代更新模型。

qq_47798402的博客 1205

C++命名空间(namespace)的使用

一、基本语法 namespace 命名空间名字 { } 注意事项:在定义命名空间时,结束不要加分号,示例如下: namespace model1 { int i;//当前变量i只对命名空间model1可见,它的作用域被限定在model1 int j; } namesapce model2 { int i;//当前变量i只对命名空间model2可见,它的作用域被限定在model2 } 由于使用命名空间后,变量的作用域被限定,所以在使用变量时,就需要通过特定方式来完成。需要用到

皮皮不调皮的博客 4884

历年北京理工大学复试专业综合题

。

A place to record sth. 2万+

把 SAP BTP Destination 写进 MTA:一段 com.sap.application.content 配置背后的部署编排学

MTA内容模块解析:SAP BTP中的声明式部署机制 本文详细解析了mta.yaml中com.sap.application.content模块在SAP BTP云环境中的作用。该模块通过声明式配置实现内容投递,无需编译或部署代码。核心功能包括: Destination创建:通过content-target:true标识将配置投递到Destination服务 HTML5应用部署:将静态资源投递到HTML5 Application Repository 安全集成:配置XSUAA服务实现OAuth2用户令牌交换

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

c++命名空间用法总结

哈喽,我又来啦 今天来总结一下c++中命名空间(namespace)和类(class)的用法 命名空间 相信各位写代码的时候都会加上这么一句话 using namespace std; namespace是啥意思 但你能一直都不知道namespace是啥意思 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越拥挤,每个人都可能使用相同的名字来实现不同的库,于是程序员在合并

我的博客 3479

华为OD机试:使用Ascend C语言实现Matmul与LeakyReLU融合算子的全流程设计与优化解析

通过本文的详细解析,相信你已经对华为OD机试中基于Ascend C语言的Matmul+LeakyReLU融合算子的设计与实现有了深入的理解。我们不仅从理论上探讨了融合算子的核心优势,还通过实际的代码示例演示了如何一步步完成算子的实现与优化。融合算子在AI算子开发中的应用,尤其是在处理大规模矩阵计算的场景中,能够显著提升计算效率,优化内存占用,并减少数据传输的开销。通过合理的Tiling策略设计,我们还能够充分利用多核处理器的算力,进一步提升AI模型的训练与推理性能。

qq_38334677的博客 661

1、cpp明命名空间的使用

命名空间有默认命名空间、匿名命名空间。

zd845101500的博客 375

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

cpp笔记1(命名空间、枚举)

cpp笔记1 编一个小程序,回顾一些cpp的基础知识。 /* 这是注释 */ #include <iostream> //导入头文件iostream using namespace std; //使用std命名空间,解释在最后。 int main() //主函数,程序从这里开始进行。 { cout << "Hello World"; // 输出 Hello World int a = 1; //定义整型变量,并赋值 typedef int zhengxi

Neal 的博客 466

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

cpp_1 命名空间/输入输出

#if 0 // 命名空间定义格式 namespace N { // 变量 // 函数 } // 三种定义方式 // 1. 最常见方式 namespace N1 { int a = 10; int b = 20; int Add(int left, int right) { return left + right; } } // 2. 命名空间可以嵌套 // 类似于:一个学校中可以包含多个学院 namespace N2 { int a = 30; int b =...

weixin_42536748的博客 381

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

从0到1学习c++ 命名空间

也是好久没写博客了,主播这半年一直在忙别的领域,在磁力驱动领域干了一年,最好发现自己对这个领域并不是很感兴趣,做这个领域多半都是为了发文章,现在闲下来了,主播终于也是过上好日子了,主播又可以继续从事嵌入式行业了,嵌入式赢!!!好了废话不多说,这几天在学习c++,想着顺便写一篇博客,记录一下自己学c++的过程。

2301_79779075的博客 466

C++ (1)命名空间

为什么要使用命名空间一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。例如小李和小韩都参与了一个文件管理系统的开发,它们都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,很明显编译器会提示 fp 重复定义(Redefinition)错误。为

To Be Continue 279

【C++入门(1)】命名空间

我们先简单认识下C++的来历,C++是在C语言的基础上发展来的。当年C++的设计者Bjarne Stroustrup,本贾尼·斯特劳斯特卢普先生设计C语言之初,是为了对C语言做出一些更改,弥补C语言在一些方面的不足,或者做出其他的设计,来让C语言更加适合程序员的使用。简而言之,Bjarne Stroustrup当时只是考虑做些小的补充,然而后来,随着补充工作的逐渐增多,以及一些大的改动,他的“补充版C语言”最终演变成了一门新的语言,也就是C++.

jk23728的博客 1044

从0到1:C++语法之命名空间

定义命名空间,需要用到namespace 关键字,后面跟命名空间的名字(一般开发中是用项目名字做命名空间名),最后加一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。// 命名空间中可以定义变量/函数/类型int val;namespace 本质是定义出了一个域(这里区分结构体),这个域跟全局域各自独立,不同的域中可以定义同名变量,所以上面的 rand 就不会发生冲突了。C++ 域中有函数局部域、全局域、命名空间域、类域;

2403_88695928的博客 1068

C++1-命名空间

C++中的命名空间可以提供一个简单的方法去解决C语言的这方面的弊病。2、命名空间的本质是定义出一个新的域,这个域和其他域之间相互独立,因而可以在不同的域中定义相同名的变量,其实就是相当于将我本人所定义出来的所有变量封装在一个属于我的大箱子里,编译器面对在不同大箱子中的同名的变量,只需要确定去哪个箱子里找就可以找到一个确定的对象。3、命名空间不影响变量的生命周期,建立命名空间只是为了把这些变量打上我个人的烙印而已,是改变了对应变量的作用域,变量本身的生命周期是由它的存储位置决定的(栈区,堆区,静态区等)。

m0_73665139的博客 592

C++知识总结1 ——命名空间

初学c++基础知识点系列1之命名空间详解

qq_62888595的博客 170

从C语言开始的C++编程生活(1)——命名空间、输入和输出

本系列文章承接C语言的学习,需要有C语言的基础才能学会哦。 第1篇主要讲的是有关于C++的命名空间、输入和输出。

Elnaij的博客 899

C++命名空间

代码参考: 余文溪的《C++ STL --数据结构与算法实现》原书代码为控制台。 这里用 C++ Builder代码演示

hylhyl168的博客 197

C++入门(1)—命名空间、缺省参数

C++入门(1)—命名空间、缺省参数

Han同学 1333

C++入门1.命名空间

为什么C++引用后有using namespace std,以及命名空间用法,基本注意事项

nainaire的博客 640
上一篇: 7种排序算法,C语言代码实现与常见陷阱,采用动图演示让你彻底搞懂排序的奥秘!
下一篇: 【C++】2.C++的输入与输出
ProcedureStone
博客等级 码龄4年 254粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值