C++ namespace 使用梳理

前言

发现 namespace 这个小细节在工作项目中处理的有一点点小混乱,于是稍微梳理了一下关于 C++ namespace 使用相关的使用内容,为日后项目的重构做准备,虽然是很小的点,但是也是值得注意的,毕竟代码的质量体现在每一个细节中。否则在项目代码中无组织,更容易造成理解上的困难。

Namespace的作用和好处包括:

  1. 避免命名冲突:通过将代码组织在不同的namespace中,可以避免不同部分的代码使用相同的名称导致的冲突。
  2. 提高代码的可读性和可维护性:使用namespace可以更清晰地组织代码,帮助开发人员更容易地理解和维护代码。
  3. 提高代码的可重用性:通过将相关功能或类组织在同一个namespace中,可以更容易地重用这些代码。
  4. 控制访问权限:可以使用namespace来限制对代码的访问权限,从而提高代码的安全性。

对于一些开源代码,针对不同目的有不同地使用方式。

ONNX 源码

简单一点的,就是例如 ONNX 项目,所有代码的 C 文件,通篇使用统一地 namespace ONNX_NAMESPACE {

}

达到一定地避免冲突目的即可。

PyTorch 源码

Pytorch 源码中,因为功能更复杂,模块更多,则是根据模块进行了 namespace 的划分:

请添加图片描述

例如上图文件结构,对应文件夹目录,每个目录中的 namespace 分别为:torch::jit ; torch::lazy ; torch::maps;torch::onnx 等。

TVM 源码

TVM 类似。也是主要根据目录来。有 tvm::relax; tvm::te; tvm::tir 等 namespace 划分。

MLIR 源码

当然还有另一种形式,例如 LLVM 中的 MLIR 模块,根据主要功能性也分成 mlir::detail; mlir::query; 并且没有严格按照目录来,而是以模块实现的功能为主。

请添加图片描述

然后一种新的写法,在 .cpp 文件中:

using namespace XXX;

就可以不用在文件头尾写 花括号了,数量上至少可以少些一行代码。 不过如果有新增的辅助类,相关声明不要忘记还是需要包一层的。例子如下:

mlir\lib\Pass\PassCrashRecovery.cpp

请添加图片描述

新定义了 RecoveryReproducerContext 结构体,然后在结构体外进行定义。

当然每个软件站有自己的实现方式,这里仅采样 4 个开源框架作为参考。

扩展阅读

关于匿名 namespace:
c++ - What effect does an unnamed namespace have on a class? - Stack Overflow

关于 detail 等常见命名含义:
If it’s an implementation detail then name doesn’t matter at all if you’re consistent across your library (and this will help you, not your library users). As you don’t care (from an outside point of view) how private variables are named (in fact there are tons of conventions for that). detail, internal, implementation, impl, core…what you want

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/502456.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(二)项目实现-第五篇-核心功能车票预定开发及nacos集成

本文参考自 Springboot3微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第(二)章——项目实现 的第五篇,本篇讲解该项目的核心功能——余票查询、车票预定功能的基础版开发,以及讲解项目与Nacos的集成…

linux 下固定摄像头的设备名字

为什么写着一篇文章 在做基于ARM-Linux的垃圾分类垃圾桶的时候,在不小心松动usb摄像头的或者是重新连接的时候,摄像头的编号会改变。有时候etc/udev/video2 ,有时etc/udev/video3这样使得每次运行的时候都需要修改编号。 什么是udev规则 u…

Pillow教程03:图像处理的基本步骤+分离split+合并merge+混合blend+composite遮罩

--------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁剪…

mysql进阶知识总结

1.存储引擎 1.1MySQL体系结构 1).连接层 最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证…

关于v114之后的chromedriver及存放路径

使用selenium调用浏览器时,我一直调用谷歌浏览器,可浏览器升级后,就会再次遇到以前遇到过的各种问题,诸如:1、怎么关闭浏览器更新;2、去哪儿下载chromedriver;3、114版本之后的驱动去哪儿下载&a…

面试题:JVM的垃圾回收

一、GC概念 为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,所以,在Java语言中,有了自动的垃圾回收机制,也就是我们熟悉的GC(Garbage Collection)。 有了垃圾回收机制后,程序员只需要关…

力扣2. 两数相加

Problem: 2. 两数相加 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建虚拟头节点dummy,用于存储相加的结果数字; 2.让指针p1、p2、tail分别指向l1、l2、dummy,定义int变量carry记录每次相加的进位值; 3.当p1不为空或者p2不…

双非计算机考研目标211,选11408还是22408更稳?

求稳得话,11408比22408要稳! 很多同学只知道,11408和22408在考察的科目上有区别,比如: 11408考的是考研数学一和英语一,22408考察的是考研数学二和英语二: 考研数学一和考研数学二的区别大吗…

会话跟踪技术(Session 以及Cookie)

一: 前提概要 1>会话: 会话指的是用户打开浏览器, 访问某些web服务器资源的时候, 会话就会进行建立, 直到有一方断开, 那么会话才会结束, 需要注意的一点是, 一次的会话可以有多次的请求以及响应 2>会话跟踪: 是一种用于维护浏览器状态的方法, 服务器需要识别多次的请求,…

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下,3月25日下午,和鲸科技 2024 年“人工智能X”学科建设合作交流会(北京站)暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境,本次会议特别采取闭门审…

Flink on Kubernetes (flink-operator) 部署Flink

flink on k8s 官网 https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.1/docs/try-flink-kubernetes-operator/quick-start/ 我的部署脚本和官网不一样,有些地方官网不够详细 部署k8s集群 注意,按照默认配置至少有两台wo…

概率论经典题目-二维随机变量及分布--求离散型的联合分布律和边缘分布律问题

题目:一整数N等可能地在1,2,3,…,10十个值中取一个值设DD(N)是能整除N的正整数的个数,FF(N)是能整除N的素数的个数(注意1不是素数).试写出D和F的联合分布律,并求边缘分布律? 解答: 1)要确定整数 N 能够被整除的正整数个数 D 和素…

Quiet-STaR:让语言模型在“说话”前思考

大型语言模型(llm)已经变得越来越复杂,能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题,与人类不同LLM经常在推理中涉及的隐含步骤中挣扎,这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…

可重复不限数量结构数列的演化

有一个6*6的平面,这个平面的行和列可以自由的变换,在这个平面上有一个4点结构数列 按照8,13,5,8的顺序排列。让这个数列按照4-5-4的方式演化 这个数列很快收敛,收敛顺序为13,8,8,5 8…

Revit文件版本查看小工具

最近群里和私信的时候,经常有小伙伴询问如何不打开Revit查看Revit文件的版本。 习惯性的,第一思路是打开Dynamo,但是第一反应还需要先开Revit。 另外呢,群里小伙伴说优比的插件也可以。 总之呢,都需要一些工具&#xf…

对接中泰极速行情 | DolphinDB XTP 插件使用教程

XTP 是中泰证券推出的高性能交易平台,专为专业投资者提供高速行情及交易系统,旨在提供优质便捷的市场接入通道。目前支持股票、基金、ETF、债券、期权等多个市场,可满足不同投资者需求。 基于 XTP 官方 C SDK,DolphinDB 开发了 X…

【IDEA】使用debug方式去运行java程序

什么是debug工具? 调试工具(debug工具)是一种用于帮助程序员识别和修复程序中的错误的工具。它们提供了一系列的功能,帮助程序员在代码执行的过程中跟踪和检测问题,例如查看变量的值、检查函数的调用栈、设置断点来停…

算法学习——LeetCode力扣动态规划篇2

算法学习——LeetCode力扣动态规划篇2 343. 整数拆分 343. 整数拆分 - 力扣(LeetCode) 描述 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得…

java: 找不到符号 符号: 变量 log

在以下位置加上该配置"-Djps.track.ap.dependenciesfalse"

文件操作(随机读写篇)

1. 铺垫 建议先看: 文件操作(基础知识篇)-CSDN博客 文件操作(顺序读写篇)-CSDN博客 首先要指出的是,本篇文章中的“文件指针”并不是指FILE*类型的指针,而是类似于打字时的光标的东西。 打…