C/C++|关于 namespace 在C++中的代码组织
命名空间(namespace)在C++中用于组织代码,避免命名冲突,并提供更好的代码结构和可读性。下面详细解释命名空间在C++多文件编写中的各种作用和表达。
基本概念
命名空间是一个声明区域,用于组织代码,防止不同部分的代码中使用相同名称的符号(如函数、类、变量等)产生冲突。
namespace MyNamespace {int myVariable;void myFunction() {// 实现}
}
在上面的示例中,MyNamespace 包含了一个变量 myVariable 和一个函数 myFunction。
在多文件中的使用
文件结构示例
假设我们有以下文件结构:
- main.cpp
- math_utils.h
- math_utils.cpp
math_utils.h
在头文件中声明命名空间和其包含的函数:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_Hnamespace MathUtils {int add(int a, int b);int subtract(int a, int b);
}#endif // MATH_UTILS_H
math_utils.cpp
在源文件中定义命名空间和其包含的函数:
// math_utils.cpp
#include "math_utils.h"namespace MathUtils {int add(int a, int b) {return a + b;}int subtract(int a, int b) {return a - b;}
}
main.cpp
在主文件中使用命名空间:
// main.cpp
#include <iostream>
#include "math_utils.h"int main() {int a = 10;int b = 5;std::cout << "Add: " << MathUtils::add(a, b) << std::endl;std::cout << "Subtract: " << MathUtils::subtract(a, b) << std::endl;return 0;
}
命名空间的多种表达
嵌套命名空间
命名空间可以嵌套使用,以进一步组织代码:
namespace Outer {namespace Inner {void myFunction() {// 实现}}
}// 调用
Outer::Inner::myFunction();
C++17 引入了嵌套命名空间的简洁语法:
namespace Outer::Inner {void myFunction() {// 实现}
}// 调用
Outer::Inner::myFunction();
命名空间别名
命名空间别名可以为长命名空间提供简短的别名:
namespace MyLongNamespaceName {void myFunction() {// 实现}
}namespace ShortName = MyLongNamespaceName;// 调用
ShortName::myFunction();
⭐️匿名命名空间
匿名命名空间用于实现内部链接,其作用范围仅限于定义它的文件中:‘
namespace {void internalFunction() {// 实现}
}void publicFunction() {internalFunction(); // 在文件内可以调用
}// 其他文件无法访问 internalFunction
命名空间主要作用
1. 防止命名冲突
在大型项目中,不同的模块或库可能会定义相同名称的变量、函数或类。使用命名空间可以将这些实体放在不同的作用域中,从而避免命名冲突。
// math_utils.h
namespace MathUtils {int add(int a, int b);
}// string_utils.h
namespace StringUtils {std::string add(const std::string& a, const std::string& b);
}
在这个示例中,MathUtils 和 StringUtils 命名空间中都定义了 add 函数,但它们在不同的命名空间中,不会产生冲突。
在使用时,我们应该指明命名空间。
2. 组织代码
使用命名空间可以将相关的代码组织在一起,使代码结构更加清晰和可维护。这在大型项目中尤其重要,可以帮助开发人员更好地管理代码。
// my_project.h
namespace MyProject {namespace Math {int add(int a, int b);}namespace Utils {void log(const std::string& message);}
}
在这个示例中,MyProject 命名空间将项目的所有代码组织在一起,并在其下进一步划分为 Math 和 Utils 子命名空间,使得代码结构更加清晰。
3. ⭐️控制可见性
命名空间可以控制符号的可见性,从而实现代码的封装。通过使用匿名命名空间,可以将某些符号的可见性限制在单个文件内,防止外部访问。
// file1.cpp
namespace {void helperFunction() {// 实现细节}
}void publicFunction() {helperFunction(); // 在该文件中可以调用helperFunction
}// file2.cpp
extern void publicFunction();void anotherFunction() {publicFunction(); // 可以调用publicFunction// helperFunction(); // 错误,helperFunction在该文件中不可见
}
在这个示例中,helperFunction 被定义在匿名命名空间中,其可见性仅限于 file1.cpp 文件,外部文件无法访问,从而实现了代码的封装。
相关文章:
C/C++|关于 namespace 在C++中的代码组织
命名空间(namespace)在C中用于组织代码,避免命名冲突,并提供更好的代码结构和可读性。下面详细解释命名空间在C多文件编写中的各种作用和表达。 基本概念 命名空间是一个声明区域,用于组织代码,防止不同部…...
selenium自动化测试入门 —— 上传文件
selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素。 上传文件有两种场景:input控制上传和非input控件上传。 大多数情况都是input控件上传文件,只有非常少数的使用自定义的非input上传文件。 一、input控…...
C# Math.Round() 四舍六入五取偶
文章目录 1.重载列表2. 示例 Math.Round() 为四舍六入五取偶 1.重载列表 API说明Round(Double)将小数值舍入到最近的整数值Round(Double, Int32)将小数值按指定的小数位数舍入Round(Double, Int32, MidpointRounding)将小数值按指定的小数位数舍入,MidpointRoundin…...
springboot手动触发参数校验,service层调用参数校验
背景 入参校验一般是在控制层通过javax.validation.constraints包下的规则注解如NotNull结合Valid与Validated实现,但是有时候我们的方法不提供给controller调用,这时候就无法触发自动参数校验,为此我们可以在不更改校验代码的前提下手动触发…...
动手学深度学习4.10 实战Kaggle比赛:预测房价-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:实战 Kaggle 比赛:预测房价_哔哩哔哩_bilibili 本节教材地址:4.10. 实战Ka…...
1035 插入与归并(测试点6)
solution 类型判断:插入排序中已排序的部分有序,未排序的和原数组元素相同;否则为归并排序测试点6:对于归并排序的子序列长度,不能简单视为前k个有序则子序列长度就是k 例如该测试用例的归并排序的子序列长度应该为2&…...
什么情况下需要使用分布式事务,有哪些方案?
引言:在当今的分布式系统中,数据的一致性和事务的处理成为了关键问题。随着应用程序的规模不断扩大和复杂性的增加,单一数据库事务的能力已经无法满足需求。因此,引入了分布式事务的概念,以确保跨多个节点的操作能够保…...
Java加密体系结构参考指南-Java Cryptography Architecture
本文是从英文的官网摘了翻译的,用作自己的整理和记录。水平有限,欢迎指正。版本是:22 原文地址:https://docs.oracle.com/en/java/javase/22/security/java-cryptography-architecture-jca-reference-guide.html#GUID-815542FE-CF…...
C++中避免内存泄漏的方法
在C++中,内存泄漏是一个常见的问题,它发生在程序申请了一块内存后,没有正确地释放它。这会导致程序运行时间越长,内存占用越大,最终可能导致系统崩溃。为了避免内存泄漏,你可以遵循以下一些策略: 正确使用new和delete:当你使用new操作符动态分配内存时,确保在不再需要…...
5.1 实体完整性
一个表只能有一个主键约束,且主键约束不能取空值。 通过unique约束定义唯一性,为了保证一个表非主键列不输入重复值,可在该列定义unique约束。 primary key约束与unique约束主要区别如下。 (1)一个表只能创建一个primary key约束࿰…...
(学习笔记)数据基建-数据质量
数据基建-数据质量 数据质量数据质量保障措施如何推动上下游开展数据质量活动数据质量保障如何量化产出数据质量思考全链路数据质量保障项目 数据质量 概念:数据质量,意如其名,就是数据的准确性,他是数据仓库的基石,控…...
WINUI——Behavior(行为)小结
前言 在使用MVVM进行WINUI或WPF开发时,Command在某些时候并不能满足逻辑与UI分离的要求。这时肯定就需要其它技术的支持,Behavior就是一种。在WPF中是有Behavior直接支持的,转到WINUI后,相对有一些麻烦,于是在此记录之…...
Ruoyi5.x RuoYi-Vue-Plus新建Translation翻译类
若依框架(RuoYi)中的Translation翻译类主要作用在于实现字段值的转换或翻译功能,以提高数据展示的准确性和友好性。以下是其具体作用的一些关键点: 字段值转换:若依框架在处理数据时,有时需要将某些字段的…...
类加载的奥秘
一、类的加载过程将类的字节码文件加载到Java虚拟机中进行执行。 1.通过一个类的全限定名来获取定义此类的二进制流字节码文件(如zip 包、网络、运算生成、JSP 生成、数据库读取等)。 2.将这个字节流所代表的静态存储结构(如常量池、字段、方法等)转化为…...
Spring知识点总结
1. 简介一下Spring框架。 答:Spring框架是一个开源的容器性质的轻量级框架。主要有三大特点:容器、IOC(控制反转)、AOP(面向切面编程)。 2. Spring框架有哪些优点?谈谈你的看法。 答ÿ…...
STM32Cube系列教程11:STM32 AES加解密模块性能测试
文章目录 本次测试环境本次测试所使用的系统时钟为48MHz本次测试主要测试对大量数据进行加解密所需的时间,本次为不严谨测试,忽略了程序调用耗时,结果仅供参考。 AES算法与数据加解密加密与解密对称加解密AES算法AES-ECBAES-CBC 填充算法PKCS…...
Vue2基础:.sync修饰符的使用,认识,作用,本质案例演示,实现父子之间的通信。
.sync的作用: 可以实现子组件与父组件数据的双向绑定,简化代码。 与v-model的不同点,prop属性名可以自定义,不要一定要用value. .sync的本质: 就是:属性名和update:属性名合写。 下面我们进行代码演示…...
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 目录 一、引言 🎄队列的概念 🎄为什么要用单链表实现队列 二、单…...
DHCP服务
文章目录 一、DHCP介绍二、DHCP应用场景三、DHCP工作原理3.1)工作方式3.2)工作原理解析3.3)计算机获得IP的时间点3.4)租约更新阶段 四、DHCP服务器部署4.1)DHCP安装4.2)DHCP配置文件详解4.3)DHCP启动 五、D…...
C++笔试-剑指offer
剑指offer 文章目录 剑指offer数组[数组中重复的数据 ](https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/)将元素交换到对应的位置 二维数组中的查找二叉搜索树 旋转数组的最小数字二分查找 数组中出现次数超过一半的数字相互抵消 连续子数组的最大…...
Mac安装jadx并配置环境
jadx官网:GitHub - skylot/jadx: Dex to Java decompiler 第一种: 安装jadx命令: brew install jadx 启动jadx-gui命令: jadx-gui 可能遇到的问题: Downloading https://formulae.brew.sh/api/formula.jws.json** h…...
前端学习----css基础语法
CSS概述 CAscading Style Sheets(级联样式表) CSS是一种样式语言,用于对HTML文档控制外观,自定义布局等,例如字体,颜色,边距等 可将页面的内容与表现形式分离,页面内容存放在HTML文档中,而用于定义表现形式的CSS在一个.css文件中或HTML文档的某一部分 HTML与CSS的关系 HTM…...
超详解——python条件和循环——小白篇
目录 1. 缩进和悬挂else 2. 条件表达式 3. 和循环搭配的else 4. 可调用对象 总结: 1. 缩进和悬挂else 在Python中,代码块是通过缩进来表示的。条件判断和循环结构的代码块需要正确缩进。悬挂else指的是else子句和相应的if或循环在同一级别的缩进。 …...
DNS协议 | NAT技术 | 代理服务器
目录 一、DNS协议 1、DNS背景 2、DNS协议 域名 域名解析 二、NAT技术 1、NAT技术 2、NAPT技术 3、NAT技术的缺陷 三、代理服务器 1、正向代理服务器 2、反向代理服务器 一、DNS协议 域名系统(Domain Name System,缩写:DNS&#…...
深入ES6:解锁 JavaScript 类与继承的高级玩法
个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! ES5、ES6介绍 文章目录 💯Class🍟1 类的由来🍟2 co…...
领域驱动设计:异常处理
一、异常的处理 异常处理是领域模型要考虑的一部分,原因在于模型的责任不可能无限大。在遇到自己处理能力之外的情况时,要采用异常机制报告错误,并将处理权转交。异常就是这样一种机制,某种程度上,它可以保证领域模型…...
网络网络层之(6)ICMPv6协议
网络网络层之(6)ICMPv6协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…...
《大道平渊》· 拾壹 —— 商业一定是个故事:讲好故事,员工奋发,顾客买单。
《大道平渊》 拾壹 "大家都在喝,你喝不喝?" 商业一定是个故事,人民群众需要故事。 比如可口可乐的各种故事。 可口可乐公司也只是被营销大师们, 作为一种故事载体,发挥他们的本领。 营销大师们开发故事…...
JavaScript 如何访问本地文件夹
在浏览器环境中的JavaScript(通常指的是前端JavaScript)由于安全限制,无法直接访问用户的本地文件或文件夹。这是为了防止恶意脚本访问并窃取用户的敏感数据。 但是,有几种方法可以间接地让用户选择并访问本地文件: 使…...
ArrayList顺序表简单实现
一、创建MyArrayList框架 1.1 MyArrayList 类中实现 arr 数组 import java.util.Arrays;public class MyArrayList {private int[] arr;private int usesize;private static final int P 10;public MyArrayList() {arr new int[P];} 在 MyArrayList 类内创建 arr 数组&…...
天津网站建设的公司/免费二级域名注册网站有哪些
jquery查询表格的函数相当有用的jQuery函数,用于清除我在Karl Swedberg网站上找到的所有表格数据。 它只是从表单中删除所有数据,包括文本输入,选择框,单选按钮,复选框等...有两个版本,第二个版本可能更有用…...
网站建设工作室简介/俄罗斯搜索引擎yandex官网入口
一、查看并配置环境变量 ①在控制面板——系统与安全——系统,点击远程设置弹出“系统属性”的弹框,选择“高级”,就可以找到“环境变量”(win10用户可以直接用Cortana搜索“编辑系统环境变量”) ②在系统变量中添加…...
做游戏特效的网站/自媒体平台注册入口官网
摘 要 在以互联网为背景的时代笼罩之下,教育行业迈向新模式的今天,人们的温饱问题已不再是威胁生命安全的源头,我国随着义务教育的普及,教育水品的不断提高,高校师生队伍不断壮大,实验室安全事故代替温饱问…...
上海做网站的价格/郑州seo优化推广
创建矩阵的操作 x torch.empty(5, 3) print(x) 输出结果: tensor([[2.4835e27, 2.5428e30, 1.0877e-19],[1.5163e23, 2.2012e12, 3.7899e22],[5.2480e05, 1.0175e31, 9.7056e24],[1.6283e32, 3.7913e22, 3.9653e28],[1.0876e-19, 6.2027e26, 2.3685e21]])创建一个有初始化的矩…...
网站之家查询域名/网络游戏推广
路由操作 1.路由重分布 1.1定义:将本地路由表中一种路由协议所生成的路由翻译成的其他路由发送出去 1.2度量:ospf默认为20 rip默认16 eigrp默认为无穷大 2.操作工具 2.1AD值 RIP 120 OSPF 110 EIGRP 90或170 注意:可以针对具体路由进行更改 2…...
天津外贸网站建设公司/徐州seo建站
对象数组去重 用ES6的reduce方法 this.backTag [{id:111,name:哈哈哈1}, {id:222,name:哈哈哈2},{id:333,name:哈哈哈3},{id:444,name:哈哈哈4},{id:111,name:哈哈哈5}]; let obj {}this.backTag this.backTag.reduce(function(item, next) {obj[next.id] ? : obj[next.…...