C++篇 ---- 命名空间namespace

这篇具有很好参考价值的文章主要介绍了C++篇 ---- 命名空间namespace。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于在c语言中在定义时可能会出现重命名现象,造成空间冲突,c语言中有命名冲突:1 和库冲突。2 互相之间的冲突,变量命名冲突。所以c++中就有了对其改进的关键字namespace,针对重定义,解决空间冲突。


命名空间namespace

以下是c语言实现的代码

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

int rand = 1;

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

C++篇 ---- 命名空间namespace
这里会报错是由于变量rand与库函数中的rand相同,导致了命名冲突

如何解决命名冲突?

使用namespace。

此时修改rand的域,用域对rand进行隔离,同一个域中不能定义相同变量,因此将其隔离到其它域中

  • 类域
  • 命名空间域
  • 局部域
  • 全局域

而此时要将其修改到命名空间域中去。

当一个程序中一个变量在局部和全局并且命名空间都有创建时,编译器优先搜索访问的是局部,再全局如果命名空间域展开(展开命名空间是指编译器是否会到命名空间搜索) 的话再命名空间,否则是不会搜索访问命名空间的

展开命名空间(using naespace std):

  1. 命名空间直接展开有风险,定义和库重合会报错
  2. 建议项目中不要去展开,在我们日常用的时候展开没什么大问题
  3. 推荐指定访问,指定展开c++常用的,如 using namespace cout,using namespace cin,using namespace endl
//全局域
int a = 1;

//命名空间域
namespace zzm
{
	int a = 2;
}


int main()
{
	//局部域
	int a = 0;
	printf("%d\n", a);
	return 0;
}

C++篇 ---- 命名空间namespace

无局部时
C++篇 ---- 命名空间namespace
当变量只在命名空间域有定义时
C++篇 ---- 命名空间namespace

此时并没有将命名空间展开using或者加域作用限定符::,就相当于编译器不知道这个命名空间,所以也就搜索不到变量a,而此时可以加域作用限定符或者展开命名空间

C++篇 ---- 命名空间namespace
C++篇 ---- 命名空间namespace

是指在这个命名空间里去搜索找变量a,zzm::指定到命名空间zzm中搜索,其左边zzm的为命名空间的名字,

如果左边的为空白 :: 就表示在全局域去搜索查找

C++篇 ---- 命名空间namespace

其实在编译器中它在定义或者使用时会向前面查找,搜索是否有相同或者存在,而在搜索时又先从局部域开始,局部域没有全局域,如果都没有是不会默认到命名空间域搜索的,只有将其展开using或者使用域限定符::指定访问命名空间域

namespace zzm
{
	int a = 2;
}

using namespace zzm;

int main()
{
	//局部域
	//int a = 0;//将局部屏蔽
	printf("%d\n", a);
	return 0;
}

C++篇 ---- 命名空间namespace

但是将其命名空间展开之后有不可与全局同时用,因为此时编译器并不确定是命名空间域的还是全局域的

C++篇 ---- 命名空间namespace

不展开:相同变量在不同域中可以同时存在,只是需要使用域限定符搜索指定命名空间
命名空间展开:也就将封在命名空间里面的内容暴露在全局域了,就如上面,此时编译器也不确定访问谁
C++篇 ---- 命名空间namespace

而由开始引出的变量命名与库中相同时,也就有了解决方法。将这个变量定义到命名空间域中,直接在命名空间搜索访问

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

namespace lsy
{
	int rand = 1;
}

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

C++篇 ---- 命名空间namespace
此时也就解决了命名冲突问题了。

命名空间里面不仅仅可以定义变量还可以定义函数,结构体任意类型。且也可以嵌套命名空间

namespace n1
{
    int a = 0;
    int b;
    int Add(int left, int right)
    {
        return left + right;
    }

    namespace n2
    {
        int a = 1;
        int c;
        int d;
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}

int main()
{
    printf("%d\n", n1::a);
    printf("%d\n", n1::n2::a);//不过嵌套在搜索时先搜索外边的然后再搜索里面嵌套的
    //就像盒子都要先打开外边的叭
    printf("%d\n", n1::Add(1, 2));
    //
    return 0;
}

C++篇 ---- 命名空间namespace

而c++的库和stl都封在一个命名空间std中,c++库中的东西都在std中,像cout,cin,endl啊这些常见的都是命名空间std中的


可以说namespace是解决c语言的命名冲突而出现的

文章来源地址https://www.toymoban.com/news/detail-415739.html

到了这里,关于C++篇 ---- 命名空间namespace的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】命名空间 namespace

    在正式进入C++前,我们需要先了解了解C++。顾名思义,C++是基于C的一种编程语言,相较于C,C++写出来的代码更简洁,有时候C需要几百行代码,而C只需要几十行就可以解决,C++也很好的解决了C中存在的一些问题,例如: 命名冲突。 C++的命名空间 就能很好的解决这个问题。

    2023年04月19日
    浏览(57)
  • C++ 之命名空间namespace【详解】

    命名空间(Namespace)在编程中的作用主要有以下几点意义 避免命名冲突:命名空间提供了一种将标识符(如变量、函数、类等)组织和隔离的方式。不同的命名空间可以拥有相同名称的标识符,避免了不同模块或库之间的命名冲突。 提高可读性和可维护性:通过使用命名空

    2024年02月16日
    浏览(39)
  • 详解C++中的命名空间(namespace)

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】 在C++中,总共有63个,大家还记得在C语言中有多少个吗,没错,在C语言中总共有32个。 下面是C++的: asm do if auto return try contin

    2023年04月19日
    浏览(36)
  • 【C++技能树】NameSpace --命名空间的使用

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2023年04月16日
    浏览(37)
  • Kubernetes集群命名空间(Namespace)

    Namespace是对一组资源和对象的抽象集合. 常见的 pod, service, deployment 等都是属于某一个namespace的(默认是 default) 不是所有资源都属于namespace,如nodes, persistent volume,namespace 等资源则不属于任何 namespace 使用 kubectl get all --namespace=命名空间名称 可以查看此命名空间下的所有资源

    2024年02月16日
    浏览(34)
  • C++命名空间的定义以及使用

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名

    2024年02月02日
    浏览(41)
  • k8s学习笔记(四):命名空间(namespace)详解

    Kubernetes中的Namespace是一种用于在 集群内部组织和隔离资源 的机制。一个Namespace可以看作是一个 虚拟的集群 ,它将物理集群划分为多个逻辑部分,每个部分都有自己的一组资源(如Pod、Service、ConfigMap等)。 Namespace 适合用于 隔离不同用户创建的资源 用于给集群中的 任何对

    2024年02月12日
    浏览(36)
  • 【C#】【命名空间(namespace)】.NET6.0后支持的顶级语句使用问题

    创建C#项目且使用.Net6.0以上的版本时,默认code会使用顶级语句形式: 1、略去static void Main(String[ ] args)主方法入口; 2、隐式使用(即隐藏且根据代码所需要的类自动调用)其他命名空间(包括): using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Net

    2024年02月08日
    浏览(45)
  • 出现身份验证错误,要求的函数不受支持,这可能是由于CredSSP加默Oracle修正

    windows 11 远程桌面提示:出现身份验证错误,要求的函数不受支持,这可能是由于CredSSP加默Oracle修正 处理办法: 首先,在控制台(或win + R)中输入regedit,打开注册表; 接着按照以下目录依次展开HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesSystem,接着在System目录下

    2024年01月21日
    浏览(49)
  • windows远程连接出现身份验证错误,要求的函数不受支持,这可能是由于credssp加密数据库修正解决办法

    第一种解决办法 WIN+R 运行 gpedit.msc: 本地组策略: 计算机配置管理模板系统凭据分配加密数据库修正 选择启用并选择易受攻击。 第二种解决办法 WIN+R,运行gpedit.msc 打开注册表,进入下面路径 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystemCredSSPParameters 右击Sy

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包