为什么c++要在c语言的基础上添加命名空间?命名空间如何定义和使用?

1、为什么c++要在c语言上增添命名空间的概念

在c语言中,定义的全局变量与库中相同,或者和别人代码结合的时候可能存在相同的命名,此时就会命名冲突。c语言是没有办法很好的解决这个问题的。

假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。

​ 同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。 全

2、如何定义命名空间

​ ::域作用限定符 ,把作用域限定在全局,左边没有或者空格都行,默认就是全局,如果过你左边写了名字,那么就是就是命名空间的域。namespace{}就是命名空间的用法。

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

局部变量和局部变量可以重名,函数里面优先使用局部变量,找不到才是全局变量。

#include <stdio.h>int a = 2;
void fu()
{int a = 1;printf("%d", a);//1printf("%d",::a);//2
}

命名空间的定义:

// bit是命名空间的名字,一般开发中是用项目名字做命名空间名。
// 我们上课用的是bit,大家下去以后自己练习用自己名字缩写即可,如张三:zs// 1. 正常的命名空间定义
namespace bit
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
//2. 命名空间可以嵌套
// test.cpp
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;}}
}
//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{
int Mul(int left, int right){return left * right;}
}

定义了命名空间,里面的变量不能直接使用。

namespace bit
{// 命名空间中可以定义变量/函数/类型int a = 0;int b = 1;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);
return 0;
}

总结:

  • 各个文件链接展开后,如果重名也会报错,c语言无法解决这个问题

  • 于是在c基础上添加了命名空间域,只影响使用,不影响生命周期。

  • 多个文件中命名空间的名字可以一样,他们会合并,但是里面的变量名字你就不能一样了,你要一样的就只能改成两个命名空间。或者可以在命名空间里面再嵌套一层命名空间,访问时::::两个符号就可以了。

  • std是c++标准库的命名空间,using namespace std就是全局展开,一般不建议这样。

3、使用命名空间的三种方式

1、制定命名空间访问std::

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

2、全局展开using namespace std,一帮不建议全局展开

using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0;    
}

3、常用部分展开 using std:: cout

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

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

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

相关文章

jmeter的函数助手使用方法

如某个上传文件接口&#xff0c;一个文件只能同时被一个接口调用&#xff0c;如果被并发同时调用就会报错 创建多个测试文件 比如50并发&#xff0c;创建更多的文件防止并发多时随机数生成重复 生成随机数函数 工具–函数助手-选择random-输入范围&#xff08;1-696&#…

网络学习:IPV6基础配置

目录 一、配置接口的全球单播地址 二、配置接口本地链路地址 三、配置接口任播地址 四、配置接口PMTU 配置静态PMTU&#xff1a; 配置动态PMTU&#xff1a; 五、接口配置IPV6地址示例&#xff1a; 一、配置接口的全球单播地址 全球单播地址类似于IPv4公网地址&#xff0…

前端 js 经典:数组常用方法总结

一&#xff1a;不改变原数组的方法 1. join 数组拼接 let arr [1, 2, 3]; // 默认拼接 arr.join(""); // 默认 , 拼接&#xff0c;返回&#xff1a;1,2,3 // 使用 - 拼接 arr.join("-"); // 返回&#xff1a;1-2-3 2. concat 尾部插入 let arr [1, 2…

Redis技术学习|实战项目记录|短信登录(重点:拦截器)+ Redis代替session存储用户登录信息

学习资料声明 黑马程序员的Redis学习视频&#xff1a;黑马程序员Redis入门到实战教程 需要用到的知识&#xff1a;linux&#xff08;推荐韩顺平老师的教程&#xff0c;学到p30&#xff0c;创建好虚拟机和简单的几个命令就好。&#xff09;SSM。SpringBoot。 还用到了MybatisPl…

富格林:合理规避虚假风险安全盈利

富格林悉知&#xff0c;黄金投资不仅具有强大的保值功能&#xff0c;其剧烈的市场变化也隐含着巨大的盈利潜力&#xff0c;吸引着众多投资者入市。但投资都会存在一定的风险&#xff0c;因此大家在投资的过程中要学习总结一些技巧&#xff0c;以便能在必要时帮助投资者规避虚假…

linux系统kubernetes容器检查和恢复机制

容器检查和恢复机制 容器检查和恢复机制命令模式探针http get方式探针POD 的恢复策略 容器检查和恢复机制 在kubernetes中&#xff0c;可以为容器定义一个健康探针&#xff0c;kubelet 就会根据这个 Probe 的返回值决定这个容器的状态&#xff0c;而不是直接以容器是否运行&…

5G里面NR,gNB,en-gNB,ng-eNB是什么意思

不得不提一个国际组织&#xff0c;叫国际电信联盟(ITU, International Telecommunication Union)&#xff0c;简称国际电联。我们先看看国际电联的自我介绍&#xff1a; 国际电信联盟 『国际电联 (国际电信联盟) 是主管信息通信技术事务&#xff08;ICT&#xff09;的联合国机…

微信打卡小程序怎么做_用户的每日习惯培养神器

微信打卡小程序&#xff1a;你的每日习惯培养神器 在这个快节奏的现代社会&#xff0c;我们每天都在忙碌中度过&#xff0c;有时候甚至会忘记自己曾经立下的那些小目标、小习惯。然而&#xff0c;随着科技的不断发展&#xff0c;微信打卡小程序的出现&#xff0c;为我们的生活…

Apollo(阿波罗)配置中心

Apollo&#xff08;阿波罗&#xff09;配置中心&#xff1a; 采用分布式架构&#xff0c;它能够集中管理不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;有可视化界面 和 规范的权限&#xff0c;支持 版本管理、灰度发布、监控 等功能。 主要…

早期零撸项目,预注册即将截止, AI身份项目GenomeFi明牌空投教程

简介&#xff1a;GenomeFi基金会旨在用个人基因信息推动生物产业发展&#xff0c;他们通过AI大数据平台和区块链技术验证身份、保护个人信息、提升收入。GenomeFi和CLINOMICS&#xff08;一家基于基因组学疾病早期诊断的领先公司&#xff09;合作提供基因诊断、早期疾病检测、个…

朋友圈之于私域的意义

朋友圈作为社交媒体的一种&#xff0c;是品牌主进行私域流量营销的主要载体&#xff0c;具有推动产品销售、传播信息等多种作用。具体来说&#xff0c;朋友圈在私域中的意义可以体现在以下几个方面&#xff1a; 1. 传播信息&#xff1a;朋友圈可以成为品牌主向其潜在客户传递信…

面试算法-63-全排列

题目 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 解 class Solution {public List&l…

前端学习笔记|CSS基础

css学习 中文学习网站 https://www.w3school.com.cn/ 非语义化的标签 1.div 2.span 类型选择器 类型选择器有时也叫做“标签名选择器*”*或者是”元素选择器“&#xff0c;因为它在文档中选择了一个 HTML 标签/元素 类选择器 类选择器以一个句点&#xff08;.&#xff…

Leetcode 202:快乐数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…

2024年运维相关面试题

SLA 关键词 负责系统的 SLA 代码维护、迭代更新&#xff0c;保证任务质量和交付及时性&#xff1b;推动提升服务的可靠性、可扩展性以及性能优化&#xff0c;保障系统 SLA为系统提供基础设施 SLA 保障 SLA保障&#xff1a;服务质量保障 sla 保障建设&#xff0c;目前一是将故…

代码随想录阅读笔记-字符串【重复的子字符串】

题目 给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 示例 1: 输入: "abab"输出: True解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba…

爬虫入门系列-HTML基础语法

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单&#xff0c;但是呢&#xff0c;首先你需要了解一丢丢的html知识&#xff0c;然后再去使用bs4去提取&#xff0c;逻辑和编写难度就会非常简…

【笔试】银行校招,信息科技岗 金融科技岗笔试准备方向

【笔试】银行校招&#xff0c;信息科技 & 金融科技岗笔试准备方向 文章目录 1、银行招聘流程&#xff08;投递&#xff09;2、笔试内容分析&#xff08;笔试&#xff09;3、真题题库&#xff08;BOC&#xff09;3.1 职业能力&#xff08;行测&#xff09;3.2 英语3.3 信息科…

敏捷开发最佳实践:学习与改进维度实践案例之会诊式培养敏捷教练

自组织团队能够定期反思并采取针对性行动来提升人效&#xff0c;但2022年的敏捷调研发现&#xff0c;70%的中国企业在学习和改进方面仍停留在团队级。本节实践案例将分享“会诊式培养敏捷教练”的具体做法&#xff0c;突出了敏捷以人为本的学习和改进&#xff0c;强调了通过人员…

JNI入门学习 管理和配置的工具选择[二]

在Android开发中&#xff0c;你可以使用 CMake 或者 Android.mk 来编写 JNI 的代码。这两者都是用来管理和配置 JNI 层代码的工具&#xff0c;选择使用哪一个取决于你的喜好以及项目的需求。 使用 CMake 的优点&#xff1a; 现代性&#xff1a;CMake 是一种现代的、跨平台的构建…