【C++】命名空间详解

目录

前言

命名空间的定义

 命名空间的使用



前言

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存
在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化
避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{printf("%d\n", rand);return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

命名冲突:

C++ 要求所有标识符都是无歧义的。如果将两个相同的标识符引入到同一程序中,而编译器或链接器无法区分它们,则编译器或链接器将产生错误。此错误通常称为命名冲突

如果将冲突标识符引入到同一文件中,则结果将是编译器错误。如果将冲突标识符引入到属于同一程序的单独文件中,则结果将是链接器错误。

命名空间的定义

命名空间是一个区域,允许您在其内部声明名称以消除歧义。命名空间为其中声明的名称提供了一个作用域区域(称为命名空间作用域),这仅仅意味着在命名空间内声明的任何名称都不会被误认为是其他作用域中的相同名称。

在命名空间中声明的名称不会被误认为是在另一个作用域中声明的相同名称。

在命名空间中,所有名称都必须是唯一的,否则将导致命名冲突。

在命名空间域内,可以包含以下内容:

① 变量、对象以及它们的初始化。

② 枚举常量。

③ 函数声明以及函数定义。

④ 类、结构体声明与实现。

⑤ 模板。

⑥ 其他命名

namespace test
{int a = 10;int rand = 10;//变量int add(int x, int y)//函数{return x + y;}struct Node//结构体{struct Node* next;int val;};
}

 嵌套命名空间

namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}

同一个工程中允许存在多个相同名称的命名空间,编译器最后会合并成一个命名空间

如,一个工程中的test.h和上面test.cpp中两个N1会被合并成一个

// test.h
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
 

namespace A
{int a = 10;
}
namespace B
{int a = 20;
}int main()
{cout << A::a << endl;cout << B::a << endl;
}

 不同命名空间内可以存在相同名称的变量,二者互不影响

 命名空间的使用

使用命名空间名称及作用域限定符

namespace A
{int a = 10;
}
namespace B
{int a = 20;
}int main()
{cout << A::a << endl;cout << B::a << endl;
}

 使用using将命名空间中某个成员引入

using N::b;
using std::cin;
using std::cout;
using std::endl;
int main()
{printf("%d\n", N::a);printf("%d\n", b);cout<<b<<endl;return 0;
}

使用using namespace 命名空间名称引入

这个方法在平时做题时可以使用,但是在正式的工程项目中不建议使用,因为全部展开可以会发生命名冲突。

using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0;
}
  • 命名空间域内部封装的在展开之后相当于在全局域
  • 命名空间的展开是将命名空间域打开,编译器搜索时可以到命名空间里搜索,命名空间不展开时,编译器不会到命名空间里搜索
  • 包含头文件的展开是在预处理阶段将头文件的内容拷贝到源文件里

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发创建component组件,报错WXML file not found解决方案

报错如下&#xff1a; 解决方案&#xff1a; 在组件.json文件加上"styleIsolation": "apply-shared",&#xff1a;

信号量机制解决经典同步互斥问题

生产者 / 消费者问题、读者 / 写者问题和哲学家问题是操作系统的三大经典同步互斥问题。本文将介绍这三个问题的基本特点以及如何用信号量机制进行解决。 在分析这三个问题之前&#xff0c;我们首先需要了解用信号量机制解决同步互斥问题的一般规律&#xff1a; 实现同步与互斥…

详解JavaScript异步编程之Promise

一、前言 JavaScript是⼀⻔典型的异步编程脚本语⾔&#xff0c;在编程过程中会⼤量的出现异步代码的编写&#xff0c;在JS的整个发展历程中&#xff0c;对异步编程的处理⽅式经历了很多个时代&#xff0c;其中最典型也是现今使⽤最⼴泛的时代&#xff0c;就是Promise对象处理异…

curl命令导致你下载的文件为空原因分析

文章目录 1.前言2. 通过curl -O 下载远端文件2.1 执行curl -O下载远端文件2.2 通过curl -v 查看详细的请求和响应的信息 3.通过在curl -O 中增加 -L 参数保证curl能够自动跟踪和请求远端返回的重定向地址4.结论 1.前言 最近在进行线上项目调试的过程中需要安装调试工具&#xf…

活动回顾丨云原生技术实践营上海站「云原生 AI 大数据」专场(附 PPT)

AI 势不可挡&#xff0c;“智算”赋能未来。2024 年 1 月 5 日&#xff0c;云原生技术实践营「云原生 AI &大数据」专场在上海落幕。活动聚焦容器、可观测、微服务产品技术领域&#xff0c;以云原生 AI 工程化落地为主要方向&#xff0c;希望帮助企业和开发者更快、更高效地…

版图设计工程师的面试一般会问啥?

之前全面为大家解析了模拟版图&#xff0c;但面对面对即将找工作或者是面对明年春招的同学&#xff0c;可能对于模拟版图面试这块更感兴趣。 秋招已经进入白热化阶段&#xff0c;今天移知教育为大家整理出&#xff0c;模拟版图几道模拟版图面试题&#xff0c;带你直击模拟版图…

蓝牙BLE基础知识

目录 一、初识蓝牙BLE 1.课程介绍 2.为什么需要蓝牙技术 3.蓝牙发展历史 4.蓝牙技术优势 5.蓝牙技术简介 6.学习补充 二、物理层&#xff08;Physical layer&#xff09; 1.模拟调制 2.数字调制 3.射频信道 4.学习补充 三、链路层&#xff08;link layer&#xff0…

基于若依的ruoyi-nbcio流程管理系统一种简单的动态表单模拟测试实现(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

Linux 一键部署influxd2-telegraf

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…

VUE3好看的我的家乡网站模板源码

文章目录 1.设计来源1.1 首页界面1.2 旅游导航界面1.3 上海景点界面1.4 上海美食界面1.5 上海故事界面1.6 联系我们界面1.7 在线留言界面 2.效果和结构2.1 动态效果2.2 代码结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

Docker容器引擎(1)

目录 一.Docker 概述 为什么要用到容器&#xff1f; docker是什么&#xff1f; 容器与虚拟机的区别&#xff1f; docker的三个核心概念&#xff1a; 二.安装docker 安装依赖包&#xff1a; 安装 Docker-CE并设置为开机自动启动&#xff1a; 查看 docker 版本信息&#…