【C++】命名空间(namespace)

news2025/1/12 7:46:51

文章目录

  • 1. 为什么要有命名空间?
  • 2. 命名空间介绍
  • 3.命名空间三种使用方式
  • 4. 注意

1. 为什么要有命名空间?

  在C语言中,局部变量和全局变量如果同名,在使用时可能会造成冲突。这并不是想避免就能避免的,在程序中,不仅仅是变量,函数也大量存在,所以存在许多命名冲突的问题。特别是一个项目,如果由一个开发团队进行开发,团队中存在多名开发成员,这样的命名冲突问题就更多了。

#include <stdio.h>

int val = 10;

int main() {
	int val = 20;
	printf("%d\n", val);
	return 0;
}

  上面这段C代码,在main()函数中,不删除不注释掉局部变量val情况下,如果就想要访问全局变量val,这是无法做到的。这就是命名冲突引起的问题,也导致C语言在这方面不够灵活。

2. 命名空间介绍

  而C++中使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。如何更好地理解这段话呢?请看下面代码例子:

#include <stdio.h>
#include <stdlib.h>

int rand = 10;

int main() {
	printf("%d\n", rand);
	return 0;
}

这段程序实际上无法运行,就不说运行,因为这甚至不能编译过去,看报错信息就知道了:
在这里插入图片描述
因为在C语言标准库stdlib.h中,rand是一个函数!这个例子就更明显是命名冲突引发的问题了,不过这一个问题倒是可以解决,就是把变量rand放在main()函数局部定义,就可以使用了。虽然可以解决,但不能否认存在这样一个问题。

这时就可以使用命名空间解决这个问题了,当然这也只能是将C代码改成C++才支持。

#include <iostream>

namespace test {
	int rand = 10;
}

using namespace std;
using namespace test;

int main() {
	cout << test::rand << endl;
	return 0;
}

3.命名空间三种使用方式

  1. 命名空间 + ::(::是作用域限定符)
#include <iostream>

namespace test {
	int rand = 10;
}

int main() {
	std::cout << test::rand << std::endl;
	return 0;
}
  1. using + 命名空间::成员
#include <iostream>

namespace test {
	int rand = 10;
}

using std::cout;
using std::endl;
using test::rand;

int main() {
	cout << rand << endl;
	return 0;
}
  1. using namespace 命名空间
#include <iostream>

namespace test {
	int rand = 10;
}

using namespace std;

int main() {
	cout << test::rand << endl;
	return 0;
}

为什么有这几种用法呢?对于某些情况,需要指定命名空间,否则编译器无法区分它究竟是指哪里的。比如下面的rand,这里能看出来,编译器将其当成了stdlib.h中的rand函数。
在这里插入图片描述
再看下面这种情况,我引入了命名空间test,这时就混淆了命名空间test中的rand和标准库中的rand,所以还是得给rand指定一下:test::rand或std::rand
在这里插入图片描述

4. 注意

  通过上面的介绍了解后,命名空间确实可以解决命名空间问题,当然前提是使用规范,比如在多个命名空间中如果有一样名字的变量,那么这几个命名空间的的名字不能一样,这样不仅会造成重定义,同时也完全打破了命名空间的用途了。另外在自定义命名空间中不仅仅只是定义变量,也可以定义函数、宏等。
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《WebKit 技术内幕》之八(2):硬件加速机制

2 Chromium的硬件加速机制 2.1 GraphicsLayer的支持 GraphicsLayer对象是对一个渲染后端存储中某一层的抽象&#xff0c;同众多其他WebKit所定义的抽象类一样&#xff0c;在WebKit移植中&#xff0c;它还需要具体的实现类来支持该类所要提供的功能。为了完成这一功能&#x…

系统架构设计师教程(十三)层次式架构设计理论与实践

层次式架构设计理论与实践 13.1 层次式体系结构概述13.2 表现层框架设计13.2.1 表现层设计模式13.2.2 使用XML设计表现层&#xff0c;统一Web Form与Windows Form的外观13.2.3表现层中UIP设计思想13.2.4 表现层动态生成设计思想 13.3 中间层架构设计13.3.1 业务逻辑层组件设计1…

【Elasticsearch】索引恢复(recovery)流程梳理之副本分片数据恢复

replica shard重启具体流程 replica shard node &#xff08;generic threadpool&#xff09; 也是因为应用新的集群状态触发recovery&#xff0c;进入index阶段进入translog 阶段。先尝试重放本地的translog到global checkpoint向primary shard发起start recovery的请求&…

JVM对象创建与内存回收机制

对象的创建过程有如下步骤&#xff1a; 1.类加载检查&#xff1a; 虚拟机遇到一个new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过&#xff0c;如果没…

【golang】Context超时控制与原理

Context 在Go语言圈子中流行着一句话&#xff1a; Never start a goroutine without knowing how it will stop。 翻译&#xff1a;如果你不知道协程如何退出&#xff0c;就不要使用它。 在创建协程时&#xff0c;我们可能还会再创建一些别的子协程&#xff0c;那么这些协程的…

【书籍】强化学习第二版(英文版电子版下载、github源码)-附copilot翻译的中英文目录...

Python代码&#xff1a;https://github.com/ShangtongZhang/reinforcement-learning-an-introduction 英文原版书籍下载&#xff1a;http://incompleteideas.net/book/the-book-2nd.html 作者&#xff1a; 理查德S萨顿是阿尔伯塔大学计算机科学教授和强化学习与人工智能 AITF 主…

1.6万字全面掌握 BERT:自然语言处理(NLP)从初学到高级的全面指南

BERT&#xff08;双向编码器表示来自Transformer的模型&#xff09;是由Google开发的一种革命性的自然语言处理&#xff08;NLP&#xff09;模型。它改变了语言理解任务的格局&#xff0c;使机器能够理解语言中的上下文和细微差异。 在本博客中&#xff0c;我们将带您从 BERT …

信息安全概述

信息安全&#xff1a;防止任何对数据进行未授权访问的措施&#xff0c;或者防止造成信息有意无意泄漏、破坏、丢失等问题的发生&#xff0c;让数据处于远离危险、免于威胁的状态或特性。 网络安全&#xff1a;计算机网络环境下的信息安全。 信息安全现状及挑战 数字化时代威…

什么是VUE 创建第一个VUE实例

一、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网&#xff1a;Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进&#xff0c;不一定非得把Vu…

Docker编译多平台文件、构建多平台镜像并运行

参考官方文档&#xff1a; Multi-stageMulti-platformMulti-platform images 文章目录 方法Buildx 设置使用QEMU仿真编译文件构建镜像 使用交叉编译&#xff08;cross-compilation&#xff09;编译文件构建镜像 在x86_64上运行arm64容器 方法 如果在 x86_64/amd64 的平台上&am…

Docker 操作之数据卷挂载【云原生】

文章目录 1. 镜像1.1 基本命令1.2 案例练习 2. 容器2.1 基本命令2.2 Nginx 案例2.3 Redis 案例 3. 数据卷3.1 基本命令3.2 Nginx 案例3.3 MySQL 案例 1. 镜像 镜像命令一般分两部分组成&#xff1a;repository:tag。比如 mysql:5.7&#xff0c;表示名称加版本。 在没有指定 t…

一文掌握Python所有常见的循环用法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 循环是编程中的重要概念&#xff0c;它允许我们重复执行一组操作&#xff0c;直到满足某个条件。Python提供了多种类型的循环&#xff0c;以适应不同的需求和场景。本文将详细介绍Python中所有常见的循环用法&am…

MySQL下对[表]的操作数据类型

目录 表的操作 创建表&#xff1a; 查看表结构&#xff1a; 修改表&#xff1a; 删除表&#xff1a; 数据类型 数据类型分类&#xff1a; 数值类型&#xff1a; tinyint类型越界测试&#xff1a; bit类型&#xff1a; 小数类型&#xff1a; 字符串类型&#xff1a; …

JAVA中 Lambda 方法引用 算法

算法和数据结构 一、Arrays类 接下来学习的类叫做Arrays&#xff0c;其实Arrays并不是重点&#xff0c;但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays&#xff0c;再通过Arrays来学习Lamdba这样学习会更丝滑一些_. 1.1 …

【Qt Quick 项目(第一集Qt Quick UI 项目项目创建)】

# Qt Quick 项目 到底什么是Qt Qml、什么是Qt Quick、QtQuick应用程序与Qt Widget程序有何区别,为了让读者在学习QML之前有一个整体认识,这里先介绍几个Quick项目。 01 Qt Quick UI 项目

Java8的Stream最佳实践

从这一篇文章开始&#xff0c;我们会由浅入深&#xff0c;全面的学习stream API的最佳实践&#xff08;结合我的使用经验&#xff09;&#xff0c;本想一篇写完&#xff0c;但写着写着发现需要写的内容太多了&#xff0c;所以分成一个系列慢慢来说。给大家分享我的经验的同时&a…

【博士每天一篇论文-技术综述】Machine Learning With Echo State Networks 一篇系统讲解ESN知识的五星文章

阅读时间&#xff1a;2023-11-21 1 介绍 年份&#xff1a;2020 作者&#xff1a;徐元超&#xff0c;曼尼托巴大学 期刊&#xff1a; 无 引用量&#xff1a;无 这篇文章是一篇技术报告&#xff0c;从递归神经网络&#xff08;RNNs&#xff09;引入到回声状态网络&#xff08;…

JavaScript基础之JavaScript简介(什么是JavaScript?)

JavaScript简介 JavaScript&#xff0c;通常被缩写为JS&#xff0c;是一种轻量级、跨平台、单线程、解释编译的编程语言。它也被称为网页脚本语言。它以网页开发而闻名&#xff0c;许多非浏览器环境也使用它。 JavaScript是一种弱类型语言。JavaScript可用于客户端开发以及服…

shell编程学习

shell编程学习 变量的高级用法变量替换字符串处理获取字符索引获取子串长度抽取字符串中的子串 案例测试 变量的高级用法 变量替换 ##变量替换&#xff08;贪婪&#xff0c;从前往后匹配&#xff0c;匹配到进行删除&#xff09; test1I love you,you love me echo $test1 han…

Java研学-spring框架(一)

一 概述 1 介绍 Spring框架是一个开源的Java EE应用程序框架&#xff0c;旨在简化Java企业级应用的开发难度和开发周期&#xff0c;主要通过控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;等技术实现。   容器&#xff08;Container&#x…