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

C++空间命名

前言

提示:由于C++是在C语言基础之上,增加了很多新的东西。

本文讲解命名空间的具体使用方法


文章目录

目录

前言

一、命名空间

二、命名空间定义

1.嵌套性

2.和并性

总结

 


提示:以下是本篇文章正文内容,下面案例可供参考

一、命名空间

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

代码如下:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
	printf("%d",rand);
	return 0;
}

然后报错为:

二、命名空间定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。

namespace Morgan//名称
{
    //内容........
}

1.嵌套性

代码如下:

正常的嵌套

#include <stdio.h>
#include <stdlib.h>
namespace mo
{
	int rand = 10;
	namespace mor
	{
		int rand = 90;
	}
}
int main()
{

	printf("%d\n", mo::mor::rand);
	printf("%d\n", mo::rand);

	return 0;
}

 结果

函数嵌套

#include <stdio.h>
#include <stdlib.h>
namespace mo
{
	int rand = 10;
	namespace mor
	{
		int pr()
		{
			return 1;
		}
		int rand = 90;
	}
}
int main()
{
	printf("%d\n", mo::mor::pr());
	return 0;
}

结果

2.和并性

3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个

图片如下:

二、命名空间的使用

1.加命名空间名称及作用域限定符

代码如下:

    namespace mo {
    	int a = 10;
    	int b = 20;
    	}
    }
     
    //方法1.:命名空间名称+作用域限定符
     
    int main() {
    	printf("%d\n", mo::a);//10
    	return 0;
    }

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

代码如下:

namespace mo {
	int a = 10;
	int b = 20;
	}
}
 
//使用方法2.:
using mo::b;
int main() {
	printf("%d\n", mo::a);	//10
	printf("%d\n", b);		//20
	return 0;
}

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

代码如下:

    namespace mo {
    	int a = 10;
    	int b = 20;
    }
     
    using namespace mo;
    int main() {
    	printf("%d\n", a);
    	printf("%d\n", b);
    	return 0;
    }

直接引入空间名称,就不需要作用域限定符了,命名空间mo的大门完全敞开,想访问哪个就访问哪个。


总结

提示:这里对文章进行总结:

优点缺点

1.加命名空间名称及作用域限定符

优点:指定作用域,做到最好的隔离方法

缺点:如果要使用多次命名空间中的某一个变量或函数会很麻烦

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

优点:如果要使用多次命名空间中的某一个变量或函数可以直接引入

using将命名空间刚好为1.与2.的折中方案

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

优点:直接引入空间名称,就不需要作用域限定符了,命名空间mo的大门完全敞开,想访问哪个就访问哪个。

缺点:很容易发生冲突

相关文章:

  • 树,堆,二叉树的认识
  • 计算机存储系统
  • 返回值的理解
  • 前同事居然因为 Pycharm 的这个功能,即使离职三年也依然经常被请去喝茶~
  • IPV4地址详解
  • ubuntu 22.04学习笔记
  • 【蓝桥杯-筑基篇】基础数学思维与技巧(1)
  • 图论(入门版)
  • 使用bindgen将C语言头文件转换为Rust接口代码
  • 第九层(2):STL之string类
  • Allegro如何自动做差分对内等长操作指导
  • 搜索引擎位置跟踪应用SerpBear
  • 浅析一条SQL在mysql中是如何执行的
  • 前端艺术之毛玻璃-倾斜-日历
  • Python-Flask-2023.1.24-Review
  • 【技术性】Search知识
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • MySQL的数据类型
  • SOFAMosn配置模型
  • SQLServer之创建数据库快照
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue 重置组件到初始状态
  • Webpack 4x 之路 ( 四 )
  • WePY 在小程序性能调优上做出的探究
  • 不上全站https的网站你们就等着被恶心死吧
  • 解决iview多表头动态更改列元素发生的错误
  • 码农张的Bug人生 - 初来乍到
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 关于Android全面屏虚拟导航栏的适配总结
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​flutter 代码混淆
  • ​业务双活的数据切换思路设计(下)
  • # include “ “ 和 # include < >两者的区别
  • #QT(TCP网络编程-服务端)
  • (1)SpringCloud 整合Python
  • (2)nginx 安装、启停
  • (libusb) usb口自动刷新
  • (安卓)跳转应用市场APP详情页的方式
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)认识微服务
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Mysql的优化设置
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net core 6.0 升8.0
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net core控制台应用程序初识
  • .Net Web窗口页属性
  • .NET 常见的偏门问题
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思