C++_namespace命名空间

2023-05-16

catalog

  • 内嵌
  • enum/class/namespace命名冲突
  • 多个同名namespace的原理
  • 开头::
    • 变量/函数前
    • 命名空间前
  • 规范写法
  • 作用域
  • Base
    • 定义顺序

内嵌

c++17后, 支持: namespace A::B::C{ }写法

enum/class/namespace命名冲突

namespace A {}

class B {}

enum C {}

A B C 这3个名称, 必须相互都不同!!! 否则就产生冲突.

因为, AC的使用方式, 都是: A:: 和 C::. B的static 也是B::方式.

此时, 有一个 (同名)的 变量/函数 int D, 这个D 和 (ABC) 重名, 是不会冲突的!!!
因为, AC的使用方式 都是: A:: C::, B的使用方式是: B obj; 或 B::, 这都是和 (变量/函数) 不同.

多个同名namespace的原理

namespace AA{
	int a;
}

namespace BB{
	using ::AA::a;
}

namespace BB{ 
	int b = a;     ' 这是可以的; 上面的(using ::AA::a), 会继承下来 '
}

namespace NS{
    int a = 123;
}

namespace NS {
    int b = a;
}

其实, 你应该把它想象为: 代码合并

namespace NS{
	int a = 123;
	int b = a;
}

即: 多个同名namespace域, 其实就相当于: 自上而下的 代码合并

开头::

变量/函数前

int a = 1;
{
	int a = 2;
	
	' 此时, 使用a, 会使用到2;     如果要使用1, 则是 ::a '
	' ::a 是(强制)使用 全局域的东西. 比如你没有int a = 1, 使用::a时, 是会报错的!!! 并不会使用a=2这个 '
}


------


namespace ST{
	int a;
}

{
	using namespace ST;
	::a;     ' 这是会报错的!!!  '
			' ::a不受命名空间的影响, ::a中的a 一定是全局域的(外面没有命名空间) '
}

即, ::a, ::func() 一定是说明: a 和 func() 是全局域的.

命名空间前

在阅读一些官方文档时, 常看到: ::std::cout << "...";这种写法

为什么要在命名空间前 加一个::呢? 直接写std::cout不行吗??

namespace std{
	data = 123;
}

namespace my{
	namespace std{
		data = 456;
	}
}

{
	using namespace my;
	
	std::data;   ' 此时, 会使用456. '
	
	::std::data;   ' 使用123.::std, 说明这个std是全局的命名空间, 不受using namespace的影响 '	
}

所以, 要使用 全局的东西变量 / 函数 / 命名空间, 最好前面都加上::

规范写法

我们要研究,namespace的规范写法: 就首先应该区别 他和class里的static有何区别??
   看似,他俩好像的功能差不多。
namespaceclass里的static,最大的区别是: 
   class通常写在.h头文件里
   而且,classconst/static一样,是相对本文件的'局部'量
        意味着:  每个cpp里的,虽然都是#include同个头文件
        		但最终,每个cpp里的 都是不同的!!! 
        		并不是真正意义上的: 全体文件共用
而namespace他就是全体文件共用!! 
 namespace就是这样,你完全可以将namespace去掉!! 
 即,你就看他里面的东西即可 (完全不受namespace的影响!! )

所有,通常namespace的用法:

1.h头文件里:
namespace SP{ ' 写声明 '
	extern int xx;
	extern void xx();  
}

在某一个cpp里,实现每个: SP::xx

1.cpp、2.cpp、3.cpp等里: #include "1.h" 即可


' 你把namespace 改成 class+static的方式, 可以达到相同的效果 '
'    但,会带来不必要的消耗!!!  因为,class是相对本cpp文件的!! '
'    classconst/static变量一样, 并不是全体文件共用的!!! '

   

作用域

namespace的作用域是' 所有cpp文件 ',而不是'当前文件'
 '我们知道,class ST{..}staticconst的作用域是当前文件 '

' 1.cpp里: '
int G_A = 123;
namespace SP{
	int sp_a = 456;
}
' 2.cpp里:' 
namespace SP{
	extern int sp_a; ' 引用: 1.cpp里的SP::sp_a '
}
  如果你要在2.cpp的SP里面,使用G_A这个变量!!
  比如: namespace SP{ int sp_b = G_A; }
  首先,你肯定需要引用G_A这个变量; 即需要extern int G_A;这句代码
  ' 这句话,你不可以写到SP里面!!! '2.cpp:
extern int G_A;  ' 不可以写到SP里面 '
namespace SP{
	extern int sp_a; ' 以至于: 2.cpp可以使用1.cpp里的SP::sp_a=456 '
	int sp_b = G_A; ' 使用2.cpp里的G_A全局变量 '
}
'  即,你在namespace SP写的: extern int A; '
'    表示:  在其他cpp文件的namespace SP{..}里找 '
'           有没有int A这个变量的定义!!! '
'	  他并不会在 其他cpp的全局域里找,而是在SP域里找! '

---------------------------------------------------------

namespace SP{
	void func();
}
void SP::func(){ ... }
' 有点类似于, 类的实现 '
' 但这种写法没有应用性 '

Base

namespace XX{ ... };
' 必须写在“全局”里,他是解决: 你需要定义2个“全局变量A/函数FF”冲突的问题 '
' namespace是对:“全局变量”,即堆空间 进行“命名”划分区域而已 '

int A = 123;
void FF(){ ... }
namespace NAMESPACE{
    int A = 456;		' 这2个A变量, 和2个FF函数。 不冲突!!! '
    void FF(){ ... }
    void xx(){
			A;   ' 优先使用NAMESPACE里的, 其次是全局的。 '
    }
}

{
	namespace TT = NAMESPACE;  / 起别名, TT的生命期,就在这个{}作用域里。
	DE( TT::A );
    
    using namespace NAMESPACE;  / 你直接写A即可。 他的作用域 也是在{}DE( A ); '===注意,此时如果“全局有int A” 同时 “namespace里也有int A'
        	' 是会报错的!!!  因为确实不知道,你要的是哪个!!!'
        	' 所以,如果使用using namespace XX; '
       	'	你必须保证: 你XX里的所有变量/函数,和 你的全局的变量/函数,没有重名的'
        '  因为,本来 按规范的来,应该是: NAMESPACE::A来使用。'
}

定义顺序

namespace ST{
	void f1(){ f2(); }
	void f2(){ .... }
}
' 这样是会报错的!!!  因为到f1时,f2()还没有实现出来 '

' 所以,在写namespace时,几乎你就把他当成没有,当成正常的全局函数 '

处理:
namespace ST{
	extern void f1(); ' extern可以不写 '
	extern void f2();
}
void ST::f1(){ f2(); }
void ST::f2(){ }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++_namespace命名空间 的相关文章

  • 对‘image_transport::ImageTransport::~Image Transport()’未定义的引用

    这是因为cmakelist文件没配置好 xff0c 一般的cmakelist文件配置如下 xff1a cmake minimum required VERSION 2 8 3 project first test pkg Compile a
  • 【VIO笔记(学习VINS的必备基础)】第六讲 视觉前端

    文章目录 前端工作的综述特征点提取 匹配和光流为什么需要角点角点的提取光流的计算光流的总结 关键帧与三角化关键帧三角化三角化程序实现 系列教程来自某学院 xff0c 侵权删除 学习完这一系列课程再去看VINS才能做到不吃力 xff0c 不然
  • windows开机自启动frp教程

    https wp gxnas com 12153 html
  • ubuntu20.08下获取realsense内参

    ubuntu20 08下使用realsense过程记录 介绍一 安装SDK1 注册公钥2 将服务器添加到存储库列表中3 安装库4 安装开发者和调试包5 测试SDK 二 下载realsense2 camera包1 下载包2 测试包3 激活相关
  • 深度视场角(Depth Field of View)

    深度视场角 Depth Field of View Realsense相机深度图的建立依赖双目立体成像原理 xff0c 其有效视场是左 右成像器视场的重叠部分 xff0c 如下图所示 顺带一提 xff0c 这张图不能用于计算双目相机深度成像
  • ROS: Publisher and Subscriber

    通过上一节编写ROS的第一个程序hello world xff0c 我们对ROS的整个编程开发过程有了基本的了解 xff0c 现在我们就来编写真正意义上的使用ROS进行节点间通信的程序 由于之前已经建好了catkin ws这样一个工作空间
  • phpStorm2018安装教程

    1 鼠标右击 PhpStorm 2018 2 3 压缩包选择 解压到PhpStorm 2018 2 3 2 双击打开解压后的 PhpStorm 2018 2 3 文件夹 3 鼠标右击 PhpStorm 2018 2 3 exe 选择 以管理
  • 学习Java第一个星期感受和收获

    最近在学习java xff0c 学了有一个星期 xff0c 说一说这个星期的收获和总结吧 xff01 首先我也是从一个小白做起 xff0c 这个星期学习了很多 xff0c 很多java基础知识 xff0c 我印象比较深刻的是基本数据类型和引
  • MySql知识体系总结(2021版)

    一 MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储 提取相分离 下面是MySQL的逻辑架构图 xff1a 1 第一层负责连接管理 授权认证 安全等等 每个客户端的连接都对应着服务器上的一个线程 服务器上维护了一个线程
  • freertos与linux区别,μClinux、μC/OS-II、eCos、FreeRTOS和djyos操作系统的特点及不足-嵌入式系统-与非网...

    基于 STM 平台且满足实时控制要求操作系统 xff0c 有以下 5 种可供移植选择 分别为 Clinux C xff0f OS II eCos FreeRTOS 和都江堰操作系统 djyos 下面分别介绍这五种嵌入式操作系统的特点及不足
  • SM4加密算法原理以及C语言实现

    文章目录 一 算法原理描述1 密钥及密钥参量 xff1a 2 加密算法 3 解密算法 xff1a 4 密钥扩展算法 xff1a 二 C语言算法实现 h部分代码 xff1a c部分代码 xff1a 一 算法原理描述 SM4分组密码算法是一个迭
  • SIM900A GPRS无线通信

    文章目录 一 模块介绍1 基本概况2 GPRS通信开发说明 二 TCP连接实现及其源码1 TCP连接实现方法2 程序源码 xff08 基于MSP430F149单片机 xff09 1 main c2 Config h及Config c3 SI
  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四
  • float型数据与4字节之间的转换

    文章目录 一 前言二 地址指针转换的方法三 共用体的方法 xff08 注意要定义全局变量数组s xff0c 即地址要分配为固定地址 xff09 一 前言 在与上位机之间进行数据收发 xff0c 要将float型数据转换成字节进行传输 xff
  • USB虚拟串口实现多字节数据接收,基于stm32h743

    文章目录 一 USB虚拟串口原理简介二 接收函数实现源码三 小结 一 USB虚拟串口原理简介 USB 虚拟串口 xff0c 简称 VCP xff0c 是 Virtual COM Port 的简写 xff0c 它是利用 USB 的 CDC 类
  • EC20/EC25 4G模块AT指令开发总结

    文章目录 一 EC25 20 4G模块简介二 AT指令总结1 通用AT指令2 建立TCP UDP连接相关AT指令 三 TCP传输数据流程四 UDP传输数据流程五 总结 一 EC25 20 4G模块简介 EC25 是一系列带分集接收功能的 L
  • C语言实现socket网络编程及多线程编程

    文章目录 一 概述二 TCP socket网络编程1 server端程序实现 xff08 tcp server cpp xff09 2 client端程序实现 xff08 tcp client cpp xff09 3 编译与执行 三 UDP
  • 基于openssl实现https双向身份认证及安全通信

    文章目录 一 概述二 代码设计2 1 ssl server c程序设计2 2 ssl client c程序设计 三 测试 一 概述 https基于SSL TLS提供安全的通信信道 xff0c 基于证书认证技术实现服务器和客户端之间的身份认证
  • ubuntu的不同版本

    ubuntu是现在最流行的Linux安装包 xff0c 本文介绍了ubuntu的各种版本 一 Ubuntu 每个ubuntu的版本都包含一个版本号 xff08 version number xff09 和一个代码名 xff08 code n

随机推荐

  • Linux下通过service服务管理用户进程

    文章目录 一 service配置介绍1 1 service配置文件1 2 配置文件的区块1 3 修改配置文件后重启1 4 服务管理 二 设计一个可执行程序三 设计一个service管理 home ubuntu test servicetes
  • c++中多态调用场景下基类析构函数的virtual声明

    文章目录 一 基类析构函数未加virtual声明的情况1 1 基础示例演示1 2 进阶示例演示 二 基类析构函数添加virtual声明的情况三 总结 一 基类析构函数未加virtual声明的情况 在多态场景中 xff0c 可通过基类的指针指
  • protobuf协议原理及实现,基于c++

    文章目录 一 protobuf协议简介1 1 protobuf协议简介1 2 数据交互xml json protobuf格式比较1 3 关于 ProtoBuf 的一些思考 二 protobuf库安装三 protobuf库使用第一步 xff0
  • OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式 xff0c 8080并口 xff0c IIC xff0c SPI三种驱动方式 xff0c 采用的单片机是STM32F407 文章目录 一 OLED驱动原理介绍二 8080并口驱动方式三 IIC驱动方式四
  • ROS2学习笔记(1)ROS2+docker的配置方法

    ROS2学习笔记 xff08 1 xff09 ros2 43 docker的配置方法 1 前言2 安装docker2 1 docker的发展史2 2 什么是docker2 3 docker的思想2 3 1 集装箱2 3 2 标准化1 运输方
  • ubuntu之更改ubuntu和windows双系统启动顺序

    ubuntu之更改ubuntu和windows双系统启动顺序 背景方法 背景 安装好ubuntu和windows双系统后 xff0c 一般grub引导默认选择第一个为启动项 xff0c 在公司打工还好 xff0c 毕竟要进ubuntu挣钱
  • 【lightDM】组件理解

    前言 LightDM xff08 Light Display Manager xff09 是轻量级 Linux 桌面显示管理器 其目的是成为 X org 的 X Server 的标准显示管理器 LightDM 负责启动 X servers
  • 【机器人学中的状态估计】第一讲

    1 什么是状态估计 xff1f 通过获得传感器的观测值 xff0c 建立观测值到状态量的模型 xff0c 估计出状态量 2 概率密度函数 后验概率 p x y
  • VScode环境下使用git与github远程操作要点记录

    部分内容来源于网络 xff0c 外加了自己的实践 xff0c 记录了一下 文章目录 一 windows上使用git1 官网下载git https git scm com download win 2 创建本地仓库 二 git远程连接gith
  • 【千律】C++基础:TXT文件的创建、写入和读取

    include lt fstream gt include lt iostream gt using namespace std int main 初始化 ifstream iread txt 初始化输入流 ofstream write t
  • Matlab计算福利彩票的中奖概率

    Quez1 计算福彩双色球一等奖的中奖概率 福彩双色球的玩法如下 从编号1 33的红球里任选6个 另外在编号1 16的蓝球里再任选1个 如果选择的红球和蓝球和当期的开奖结果完全一致 顺序可不同 则中一等奖 Analysis 这是一个组合问题
  • 【千律】OpenCV基础:基于梯度的模板匹配

    环境 xff1a Python3 8 和 OpenCV 内容 xff1a 基于梯度的模板匹配 主要关注边缘信息 xff0c 能够较好的识别不同颜色的目标 实现步骤 xff1a 1 给定原图像I和模板T 2 指定差异度 xff08 相似度 x
  • golang使用SM2(SM2withSM3)签名、验签数据

    golang使用SM2签名 验签数据 场景标准密钥签名算法 Start依赖公钥转base64私钥转hex私钥生成公钥生成密钥对Hex私钥转私钥对象base64公钥转公钥对象签名验签 测试 场景 对接招行支付 标准 密钥 私钥 xff1a H
  • 树莓派与pixhawk串口通信

    一 Pixhawk部分 1 读取数据测试 步骤 xff1a 在Firmware src modules中添加一个新的文件夹 xff0c 命名为rw uart在rw uart文件夹中创建CMakeLists txt文件 xff0c 并输入以下
  • 关于pixhawk波特率修改的两种方法

    一 QGC地面站修改 将pixhawk与地面站相连接进入参数设置界面 xff0c 搜索SYS COMPANION参数设置需要的波特率保存设置 二 终端 xff08 Terminal xff09 修改 打开终端 xff0c 进入源码所在Fir
  • gazebo仿真环境搭建

    主要内容 xff1a 安装gazebo配置gazebo运行gazebomavros控制飞机 1安装gazebo 如果已经安装MAVROS可以直接在终端上输入gazebo查看是否已经拥有gazebo xff0c 因为MAVROS中含有gaze
  • Intel Realsense D435i标定详细步骤

    主要介绍Inter D435i深度相机的IMU 相机和IMU与相机外参数标定的过程 其中 IMU使用的是realsense官方文档的教程 相机和外参数使用的是Kalibr的标定方法 本文所介绍过程的所有代码和生成文件资源放在Kalibr工具
  • 在Ubuntu、NVIDIA_TX2下查看CPU/GPU/内存使用率

    一 Ubuntu 1 cpu 内存 1 使用top命令 top 2 更直观的工具htop sudo apt get install htop htop 2 gpu 用nivida smi命令 xff0c nvidia smi 这个命令只能显
  • 基于RT-Thread OS的 迷你时钟项目

    基于RT Thread OS的 迷你时钟项目 近期在自学RT Thread OS 这是一个国内团队开发的实时物联网操作系统 xff0c 具有组件完整丰富 高度可伸缩 简易开发等优点 RTOS官网 参考学习文档 作品演示 基于RT Threa
  • C++_namespace命名空间

    catalog 内嵌enum class namespace命名冲突多个同名namespace的原理开头 变量 函数前命名空间前 规范写法作用域Base定义顺序 内嵌 c 43 43 17后 支持 namespace A B C 写法 en