【C++ 记忆站】命名空间

文章目录
- 命名空间概念
- 命名空间的定义
- 1、正常的命名空间定义
- 2、命名空间可以嵌套
- 3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
- 命名空间的使用
- 1、加命名空间名称及作用域限定符
- 2、使用using将命名空间中某个成员引入
- 3、使用using namespace 命名空间名称 引入
- 4、使用using namespace std C++标准库命名空间 引入
命名空间概念
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
很多人在开始接触C++的时候,知道打印一行 hello world 都是这样写的:
#include
using namespace std;
int main()
{
cout << “hello world” << endl;
}
但是要问你iostream 和 namespace std 是什么,在这行代码中起到什么作用,很多初学者基本上是回答不上来的,就知道怎么写,不知道其中的意义。
那么现在就开始认识命名空间这个概念
大家都知道C++是在c语言基础上建立的,c语言很多地方存在很多缺陷的,C++就创建了一个命名空间的概念来弥补这一缺陷
这一缺陷是什么呢?创建一个全局变量 int rand = 0 ,你只引入了头文件 <stdio.h> ,利用printf打印出rand,不会产生任何问题。可当你再引用了 <stdlib.h> ,再次运行程序就会出现问题

这里报错,显示rand重定义,这里的问题叫做命名冲突,因为 stdlib.h 这个库里面已经定义了rand,且定义成的一个函数,而我们这个全局变量rand是int类型的元素,系统在识别这个rand的时候就会找到两个rand,它不知道去打印哪一个,当然这里刚好rand在库里面是个函数 且与%d发生冲突,显示两个错误
在c语言中,解决这一问题,最简单粗暴的方法,就是改变量名称,防止与库里面的同名变量命名冲突,这样当然可以解决问题,但如果你在一个团队中需要分组完成一个项目,每个组的个别变量都一样,这时候怎么办,总不能组与组直接吵一架吧,这会大大降低工作效率不说,也影响团队氛围嘛,所以显然这种方法不可取。

既然c语言不能解决这个问题,那么C++就提出了命名空间来解决
这里就要引入一个关键字 namespace ,它的作用是创建一个域把创建的rand变量保护起来,下面是代码实现
namespace Yuan
{int rand = 0;
}
int main()
{printf("%d\n", rand);
}
namespace 后面的名字随便取什么都行,只要自己记得住
这样就不会产生命名冲突的问题,main里面打印的是库函数里面的rand(准确来说是访问全局的域来找到rand),并不是Yuan里面的rand
要想打印Yuan里面的rand需要在rand前面加Yuan::
namespace Yuan
{int rand = 0;
}
int main()
{printf("%d\n", Yuan::rand);
}
namespace创建的是一个命名为Yuan的局部域,这里需要回顾一下C语言里面的全局变量和局部变量
int i = 0;
int main()
{int i = 1;printf("%d", i);
}
现在问大家一个问题,这里打印的i是0还是1?
答案是1,这里满足一个
就近原则,打印结果是1,这里是直接访问的局部域里面的局部变量i
但是如果你想在局部域里面访问全局变量i,怎么办?
需要在i前面加
::
int i = 0;
int main()
{int i = 1;printf("%d\n", ::i);printf("%d\n", i);
}
::叫做域作用符,作用是指定在哪个域里面去找这个i,这里::左边是空白,就代表在全局域里面去找

所以命名冲突问题有了命名空间这个概念,就迎刃而解了。A B C三个小组,每个小组写的所有的变量全都保存在他们自己所定义的命名空间里面,且命名空间分别交nodeA nodeB nodeC,即使各自的命名空间里面有相同的变量,也不会收到任何影响
命名空间的定义
1、正常的命名空间定义
命名空间里面可以定义变量,函数,类型等
namespace Yuan
{int rand = 0;void func(){printf("func()\n");}struct TreeNode{struct TreeNode* left;struct TreeNode* right;int val;};
}int main()
{printf("%p\n", rand);printf("%p\n", Yuan::rand);Yuan::func();struct Yuan::TreeNode node;return 0;
}
2、命名空间可以嵌套
命名空间可以嵌套,就想循环语句一样
namespace sql
{int a = 0;namespace Yuan{int rand = 0;void func(){printf("func()\n");}struct TreeNode{struct TreeNode* left;struct TreeNode* right;int val;};}
}int main()
{printf("%p\n", rand);printf("%p\n", sql::Yuan::rand);sql::Yuan::func();struct sql::Yuan::TreeNode node;return 0;
}
3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
这一点怎么来理解呢,比如说在一个项目中我们添加了Stack.h(栈),Stack.cpp(栈),Queue.h(队列),Queue.cpp(队列),里面有很多变量,类型,函数等,现在要把它们放到一个命名空间里面,我们会担心发生命名冲突的问题,怎么处理呢?
这四个文件中分别定义一个 每次为 Yuan 的命名空间,并把文件中所有东西放到命名空间中,这四个命名空间名字相同,但不在一个文件中,编译器会自动把它们合并到一个命名空间中,不用担心命名冲突的问题
namespace Yuan
{typedef int STDataType;typedef struct Stack{STDataType* a;int top; // 栈顶的位置int capacity; // 容量}ST;
}#include "Stack.h"//栈
#include "Queue.h"//队列int main()
{Yuan::ST st;Yuan::StackInit(&st);Yuan::Queue q;Yuan::QueueInit(&q);
}
命名空间的使用
1、加命名空间名称及作用域限定符
int main()
{printf("%d\n", Yuan::a);return 0;
}
前面已经介绍了通过域作用符来进行命名空间的使用,这也是最基本最简单的一种命名空间使用方式,可这个方式如果在命名空间使用比较多的时候就显得有些繁琐了,可能这里没有加域作用符,那里又没有加,导致一堆bug,所以就有了以下三种方式
2、使用using将命名空间中某个成员引入
using Yuan::b;
int main()
{printf("%d\n", Yuan::a);printf("%d\n", b);return 0;
}
3、使用using namespace 命名空间名称 引入
using namespce N;
int main()
{printf("%d\n", Yuan::a);printf("%d\n", b);Add(10, 20);return 0;
}
4、使用using namespace std C++标准库命名空间 引入
前面两种相对就比较保守,这个就是很大胆的直接展开C++全部标准库,虽然是很大程度上避免了一定的冲突,但是这样全部展开,就可能存在冲突的风险,所以直接全部展开不推荐使用,如果要用应该是这样写
#include<iostream>
//using namespace std
int main()
{std::cout << "hello world" << std::endl;return 0;
}

相关文章:
【C++ 记忆站】命名空间
文章目录 命名空间概念命名空间的定义1、正常的命名空间定义2、命名空间可以嵌套3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中 命名空间的使用1、加命名空间名称及作用域限定符2、使用using将命名空间中某个成员引入3、使用using namespac…...
《离散数学及其应用(原书第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的例9说明
《离散数学及其应用(原书第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的定理3的引申 定理3 带有i个内点的m叉树含有nmi1个顶点 见本人博文 内点定义不同的讨论 如果对于一个m叉正则树,即任意分支节点的儿子恰好有m个&am…...
【云原生】K8S存储卷:PV、PVC详解
目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,ku…...
谈谈IP地址和子网掩码的概念及应用
个人主页:insist--个人主页 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、IP地址的概念 二、IP地址的分类 1、A类 …...
vue2 如何监听数组的变化
在Vue 2中,底层是通过重写数组的原型方法来实现对数组变化的监听。具体来说,Vue 2使用了一个名为Observer的类来劫持数组的原型方法,使其在调用这些方法时能够触发相应的变化通知。 当Vue 2初始化一个响应式对象时,如果对象是一个…...
CSS中的transform属性有哪些值?并分别描述它们的作用。
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ translate()⭐ rotate()⭐ scale()⭐ skew()⭐ matrix()⭐ scaleX() 和 scaleY()⭐ rotateX()、rotateY() 和 rotateZ()⭐ translateX() 和 translateY()⭐ skewX() 和 skewY()⭐ perspective()⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&…...
vue3跳转页面后 海康监控实例不销毁
第一个页面是这样的 跳转到新的页面 只有海康的监控没有消失 使用控制台审查元素也审查不到 解决方法:在vue3的销毁周期把海康的监控销毁掉 import { reactive, onDeactivated} from "vue"; const state reactive({oWebControl: null as any, //监控绑…...
Unity 射线检测
文章目录 1. 定义2. 重要类和方法2.1 Ray2.2 从屏幕发出射线:2.3 Raycast2.4 RaycastAll2.5 RaycastHit 碰撞信息2.6 layerMask 让射线检测只检测指定层级的对象 1. 定义 在Unity中,射线检测(Raycasting)是一种常用的技术&#x…...
微信支付报非法的密钥大小: Caused by: java.security.InvalidKeyException: Illegal key size
在Linux环境中出现 java.security.InvalidKeyException: Illegal key size 异常通常是由于Java默认的加密限制引起的。Java默认的加密强度限制了加密算法密钥的最大长度 方式一 1. 找到该目录 /usr/java/jdk1.8.0_121/jre/lib/security 2. 替换local_policy.jar 和 US_export_…...
React 调试开发插件 React devtools 的使用
可以在谷歌扩展应用商店里获取这个插件。如果不能访问谷歌应用商店,可以点此下载最新版 安装插件后,控制台出现 “Components” 跟 “Profiler” 菜单选项。 查看版本,步骤: 下面介绍 react devtools 的使用方式。 在 Component…...
linux 搜索命令
搜索命令 locate命令 搜索速度快,是按照数据库进行搜索的(数据库位置在/var/lib/mlocate/mlocate.db) locate abc.txt 这个数据库是在半夜通过cron执行updatedb建立的,有时候新创建的文件使用locate来搜索文件搜索不到,可能是因为文件的索引还…...
如何使用Spark/Flink等分布式计算引擎做网络入侵检测
如何使用Spark/Flink等分布式计算引擎做网络入侵检测 引言16 Distributed Abnormal Behavior Detection Approach Based on Deep Belief Network and Ensemble SVM Using Spark17 Spark configurations to optimize decision tree classification on UNSW-NB1518 A dynamic spa…...
基于php驾校驾驶理论考试模拟系统
驾校驾驶理论考试模拟系统,是基于php编程语言,mysql数据库进行开发,本系统分为用户和管理员两个角色,其中用户可以注册登陆系统,查看考试规则,进行驾照考试,查看考试得分,考试错题&a…...
vue3+elementPlus table里添加输入框并提交校验
<template><div><el-form :model"info" ref"forms"><el-tableref"tableRef":data"info.data"border><el-table-column align"center" property"name" label"*姓名"><…...
ios swift5 collectionView 瀑布流(两列)
文章目录 1.瀑布流1.1 demo地址1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和文字的高度 1.瀑布流 1.1 demo地址 CollectionViewWaterfallLayout - github 1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和…...
创建一个简单的HTML Viewer应用程序
使用wxPython和内嵌浏览器来创建一个简单的HTML Viewer应用程序。 在本篇文章中,我们将使用Python和wxPython模块来创建一个简单的HTML Viewer应用程序。这个应用程序可以让用户输入HTML内容,并在内嵌浏览器中显示该内容的效果。 准备工作 在开始之前…...
无公网IP,公网SSH远程访问家中的树莓派教程
文章目录 前言 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar内网穿透4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地…...
「UG/NX」Block UI 超级截面SuperSection
✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...
高层建筑全景vr火灾隐患排查模拟培训软件助力群众防范火灾伤害
随着城市化进程的加快,楼宇建筑的数量也在不断增加。然而,楼宇消防安全问题也日益突出。为了提高楼宇员工和居民的消防安全意识,楼宇VR消防安全教育培训应运而生。VR安全培训公司深圳华锐视点制作的楼宇vr消防安全教育培训,包括消…...
【WPF】 本地化的最佳做法
【WPF】 本地化的最佳做法 资源文件英文资源文件 en-US.xaml中文资源文件 zh-CN.xaml 资源使用App.xaml主界面布局cs代码 App.config辅助类语言切换操作类资源 binding 解析类 实现效果 应用程序本地化有很多种方式,选择合适的才是最好的。这里只讨论一种方式&#…...
深入解析Cache工作原理与多核一致性机制
深入理解Cache工作原理与技术实现1. 计算机体系中的Cache基础1.1 Cache存在的必要性现代计算机系统中,处理器性能与存储器访问性能之间存在显著差距。从历史发展数据来看,CPU计算性能每18个月翻一番(遵循摩尔定律),而D…...
后端/全栈/架构师转战AI大模型开发:可落地规划(建议收藏)
如果你本身是后端、全栈或架构师出身,就意味着你已经手握一套扎实的“确定性系统”构建能力——分布式部署、高并发处理、数据库事务管控、系统稳定性保障,这些都是你转型AI大模型开发的核心底牌,也是纯算法出身从业者难以快速补齐的短板。 而…...
OpenClaw配置备份指南:GLM-4.7-Flash环境快速迁移方案
OpenClaw配置备份指南:GLM-4.7-Flash环境快速迁移方案 1. 为什么需要环境迁移? 上周我的主力开发机突然硬盘故障,导致精心配置的OpenClaw环境全部丢失。重装后发现要重新对接GLM-4.7-Flash模型、配置飞书通道、安装十几个自定义技能——这个…...
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现 1. 为什么需要关注硬件配置 去年冬天,当我第一次尝试在本地部署OpenClaw对接百川2-13B模型时,我的旧显卡GTX 1660 Ti直接崩溃了。那次经历让我深刻认识到——选择合适的硬件对…...
Linux核心转储文件生成与调试全指南
1. Linux核心转储文件调试方法详解1.1 核心转储文件概述在Linux系统下,当程序发生崩溃时,系统会生成一个包含程序崩溃时内存映像的文件,称为core文件。这个文件记录了程序崩溃时的内存状态和调试信息,是定位程序崩溃原因的重要工具…...
开源AI助手竟能自主建频道、做视频?李宏毅深度解析“小龙虾”的神秘工作原理!
最近全网爆火的「养龙虾」到底是什么?为什么一个开源的 AI 助理项目,能让 AI 自己创建 YouTube 频道、自己做教学视频、24 小时自主干活? 台大李宏毅老师的这堂《解剖小龙虾 — 以 OpenClaw 为例介绍 AI Agent 的运作原理》,用最通…...
零基础学编程:借助快马与claude code生成交互式代码示例入门javascript
最近刚开始学习JavaScript,发现数组操作是编程中最基础也最常用的部分。作为一个完全零基础的小白,我尝试用InsCode(快马)平台结合Claude Code来学习这个知识点,整个过程比想象中顺利很多。这里记录下我的学习过程,希望能帮到同样…...
Nginx 简单使用配置
配置 user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote…...
电子小白之二极管
很多年前我第一次看到电路图上各种二极管符号时,心里只有一个想法:这玩意儿到底干嘛用的?硬件部门同事告诉我一句话,瞬间就通了: 正向导通,反向截止;整流防反,稳压发光。 今天就用最…...
2026年3月27日NSSCTF之[SWPUCTF 2021 新生赛]ez_unserialize
[SWPUCTF 2021 新生赛]ez_unserialize 开启环境,进入并查看,可以看到一个动图,选择查看网页源码,得到 看到有隐藏信息,根据隐藏信息可以猜测,可以利用robots协议查看相关信息,访问得到 可以得…...
