当前位置: 首页 > news >正文

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++中的代码组织

命名空间&#xff08;namespace&#xff09;在C中用于组织代码&#xff0c;避免命名冲突&#xff0c;并提供更好的代码结构和可读性。下面详细解释命名空间在C多文件编写中的各种作用和表达。 基本概念 命名空间是一个声明区域&#xff0c;用于组织代码&#xff0c;防止不同部…...

selenium自动化测试入门 —— 上传文件

selenium无法识别非web的控件&#xff0c;上传文件窗口为系统自带&#xff0c;无法识别窗口元素。 上传文件有两种场景&#xff1a;input控制上传和非input控件上传。 大多数情况都是input控件上传文件&#xff0c;只有非常少数的使用自定义的非input上传文件。 一、input控…...

C# Math.Round() 四舍六入五取偶

文章目录 1.重载列表2. 示例 Math.Round() 为四舍六入五取偶 1.重载列表 API说明Round(Double)将小数值舍入到最近的整数值Round(Double, Int32)将小数值按指定的小数位数舍入Round(Double, Int32, MidpointRounding)将小数值按指定的小数位数舍入&#xff0c;MidpointRoundin…...

springboot手动触发参数校验,service层调用参数校验

背景 入参校验一般是在控制层通过javax.validation.constraints包下的规则注解如NotNull结合Valid与Validated实现&#xff0c;但是有时候我们的方法不提供给controller调用&#xff0c;这时候就无法触发自动参数校验&#xff0c;为此我们可以在不更改校验代码的前提下手动触发…...

动手学深度学习4.10 实战Kaggle比赛:预测房价-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;实战 Kaggle 比赛&#xff1a;预测房价_哔哩哔哩_bilibili 本节教材地址&#xff1a;4.10. 实战Ka…...

1035 插入与归并(测试点6)

solution 类型判断&#xff1a;插入排序中已排序的部分有序&#xff0c;未排序的和原数组元素相同&#xff1b;否则为归并排序测试点6&#xff1a;对于归并排序的子序列长度&#xff0c;不能简单视为前k个有序则子序列长度就是k 例如该测试用例的归并排序的子序列长度应该为2&…...

什么情况下需要使用分布式事务,有哪些方案?

引言&#xff1a;在当今的分布式系统中&#xff0c;数据的一致性和事务的处理成为了关键问题。随着应用程序的规模不断扩大和复杂性的增加&#xff0c;单一数据库事务的能力已经无法满足需求。因此&#xff0c;引入了分布式事务的概念&#xff0c;以确保跨多个节点的操作能够保…...

Java加密体系结构参考指南-Java Cryptography Architecture

本文是从英文的官网摘了翻译的&#xff0c;用作自己的整理和记录。水平有限&#xff0c;欢迎指正。版本是&#xff1a;22 原文地址&#xff1a;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 实体完整性

一个表只能有一个主键约束&#xff0c;且主键约束不能取空值。 通过unique约束定义唯一性&#xff0c;为了保证一个表非主键列不输入重复值&#xff0c;可在该列定义unique约束。 primary key约束与unique约束主要区别如下。 (1)一个表只能创建一个primary key约束&#xff0…...

(学习笔记)数据基建-数据质量

数据基建-数据质量 数据质量数据质量保障措施如何推动上下游开展数据质量活动数据质量保障如何量化产出数据质量思考全链路数据质量保障项目 数据质量 概念&#xff1a;数据质量&#xff0c;意如其名&#xff0c;就是数据的准确性&#xff0c;他是数据仓库的基石&#xff0c;控…...

WINUI——Behavior(行为)小结

前言 在使用MVVM进行WINUI或WPF开发时&#xff0c;Command在某些时候并不能满足逻辑与UI分离的要求。这时肯定就需要其它技术的支持&#xff0c;Behavior就是一种。在WPF中是有Behavior直接支持的&#xff0c;转到WINUI后&#xff0c;相对有一些麻烦&#xff0c;于是在此记录之…...

Ruoyi5.x RuoYi-Vue-Plus新建Translation翻译类

若依框架&#xff08;RuoYi&#xff09;中的Translation翻译类主要作用在于实现字段值的转换或翻译功能&#xff0c;以提高数据展示的准确性和友好性。以下是其具体作用的一些关键点&#xff1a; 字段值转换&#xff1a;若依框架在处理数据时&#xff0c;有时需要将某些字段的…...

类加载的奥秘

一、类的加载过程将类的字节码文件加载到Java虚拟机中进行执行。 1.通过一个类的全限定名来获取定义此类的二进制流字节码文件(如zip 包、网络、运算生成、JSP 生成、数据库读取等)。 2.将这个字节流所代表的静态存储结构&#xff08;如常量池、字段、方法等&#xff09;转化为…...

Spring知识点总结

1. 简介一下Spring框架。 答&#xff1a;Spring框架是一个开源的容器性质的轻量级框架。主要有三大特点&#xff1a;容器、IOC&#xff08;控制反转&#xff09;、AOP&#xff08;面向切面编程&#xff09;。 2. Spring框架有哪些优点&#xff1f;谈谈你的看法。 答&#xff…...

STM32Cube系列教程11:STM32 AES加解密模块性能测试

文章目录 本次测试环境本次测试所使用的系统时钟为48MHz本次测试主要测试对大量数据进行加解密所需的时间&#xff0c;本次为不严谨测试&#xff0c;忽略了程序调用耗时&#xff0c;结果仅供参考。 AES算法与数据加解密加密与解密对称加解密AES算法AES-ECBAES-CBC 填充算法PKCS…...

Vue2基础:.sync修饰符的使用,认识,作用,本质案例演示,实现父子之间的通信。

.sync的作用&#xff1a; 可以实现子组件与父组件数据的双向绑定&#xff0c;简化代码。 与v-model的不同点,prop属性名可以自定义&#xff0c;不要一定要用value. .sync的本质&#xff1a; 就是&#xff1a;属性名和update&#xff1a;属性名合写。 下面我们进行代码演示…...

【数据结构与算法】使用单链表实现队列:原理、步骤与应用

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f384;队列的概念 &#x1f384;为什么要用单链表实现队列 二、单…...

DHCP服务

文章目录 一、DHCP介绍二、DHCP应用场景三、DHCP工作原理3.1&#xff09;工作方式3.2&#xff09;工作原理解析3.3)计算机获得IP的时间点3.4&#xff09;租约更新阶段 四、DHCP服务器部署4.1&#xff09;DHCP安装4.2&#xff09;DHCP配置文件详解4.3&#xff09;DHCP启动 五、D…...

C++笔试-剑指offer

剑指offer 文章目录 剑指offer数组[数组中重复的数据 ](https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/)将元素交换到对应的位置 二维数组中的查找二叉搜索树 旋转数组的最小数字二分查找 数组中出现次数超过一半的数字相互抵消 连续子数组的最大…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...