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

【C++】C++中的命名/名字/名称空间 namespace

C++中的命名/名字/名称空间 namespace

  • 1、问题引入
  • 2、概念
  • 3、作用
  • 4、格式
  • 5、使用命名空间中的成员
    • 5.1 using编译指令( 引进整个命名空间) ---将这个盒子全部打开
    • 5.2 using声明使特定的标识符可用(引进命名空间的某个成员) ---将这个盒子中某个成员的位置打开
    • 5.3 调用的时候指定是哪一个命名空间下的成员
  • 6、示例代码
  • 7、命名空间的嵌套
  • 8、同名命名空间
  • 9、匿名命名空间
  • 10、全局作用域

1、问题引入

\quad 探讨:在实际的系统开发中,所有的开发工作,通常都不会仅由一个人来开发完成,不同的人只负责自己功能模块,他们在设计时,比如声明变量,通常情况下,不会考虑其他人是否已使用该变量名,在模块功能测试时,相互之间是独立的,完全没有问题,当系统功能合成 时,不可避免地会出现变量或函数的命名冲突,因为变量或函数重名而导致的问题将会造成一定的混乱。所以如何在同一个.cpp文件中定义相同变量名的两个全局变量呢

#include<iostream>int val = 200;
int val = 300;int main()
{return 0;
}

现象:编译会报错
解决方法:使用命名空间区分这两个全局变量

2、概念

其实命名空间就是类似一个黑盒子

3、作用

防止名字冲突

4、格式

namespace 命名空间名字
{//声明定义变量//声明定义函数//定义结构体/共用体/枚举 数据类型//声明类  定义对象
}

5、使用命名空间中的成员

5.1 using编译指令( 引进整个命名空间) —将这个盒子全部打开

 using namespace 命名空间名字;

5.2 using声明使特定的标识符可用(引进命名空间的某个成员) —将这个盒子中某个成员的位置打开

using 命名空间名字::成员名;

5.3 调用的时候指定是哪一个命名空间下的成员

cout<<命名空间名字::成员名

6、示例代码

#include<iostream>using namespace std;//使用名称空间LcdSpace  
namespace LcdSpace{int x = 10;int y = 20;typedef struct{int data;}Data_t;enum {LCD_COLOR_RED,LCD_COLOR_GREEN};int lcd_init(){return 0;}}; 
//使用名称空间TouchSpace
namespace TouchSpace{int x = 100;int y = 200;
};//外部的全局变量   
//int x = 1000;
//int y = 2000;//2)使用using声明的方式去引入名字空间中的某个成员
//把这个TouchSpace黑盒子 打开一个角落,正好把某个成员放出来
//格式:using 命名空间名字::成员名;
//using  TouchSpace::x;void test01()
{using namespace LcdSpace;cout<<"x:"<<x<<" y:"<<y<<endl;
}int main()
{//3)使用using编译指令的方式 打开整个名字空间 using namespace TouchSpace;//如何使用名字空间里面的成员//1)使用 作用域限定符:: 去指定//格式:  名字空间的名字::成员变量名std::cout<<TouchSpace::x<<" "<<TouchSpace::y<<std::endl;std::cout<<x<<" "<<y<<std::endl;std::cout<<LcdSpace::x<<" "<<LcdSpace::y<<std::endl;LcdSpace::Data_t data;LcdSpace::lcd_init();//我们有时候为了强调该变量的全局特性,可以在前面加上::修饰cout<<x<<" "<<y<<endl;test01();return 0;
}

7、命名空间的嵌套

namespace myspace{int x=10;int y=20;namespace spaceA{int a=100;void setValue(int data){a = data;}void printValue(){std::cout<<"a:"<<a<<std::endl;}}
}
使用:
myspace::spaceA::printValue();

8、同名命名空间

\quad 命名空间可以分开定义,也就是说,你在定义一个命名空间之后,如果后面想要在这个命名空间里面再次添加某些数据成员或者函数成员,可以再次接着定义。

namespace myspace{int x=10;int y=20;
}
namespace myspace{int a=100;int b=200;void print(){std::cout<<"x:"<<x<<" y:"<<y<<std::endl;}
}

9、匿名命名空间

namespace {int data=123;
}

可以在本文件中直接使用data, 限制空间中的成员只能在本文件中使用,类似c语言中的static修饰

10、全局作用域

\quad 全局作用域是从C语言就开始有的一种作用域,在C++中,有时为了强调某符号的全局特性,或为了避免与导入的名字空间中的重名符号冲突,会在使用全局符号的时候加上 作用域解析符

int global = 100;
int main()
{int global = 200;// 重名的标识符,外层的作用域会被内层的掩盖cout <<   global << endl; // 输出200// 使用双冒号引用全局作用域中的标识符cout << ::global << endl; // 输出100
}
  • 全局作用域的名字空间是匿名的,引用全局作用域符号只需加 :: 即可。
  • 名字空间的本质就是作用域,遵守C语言关于作用域的基本原则,如内层作用域重名符号会掩盖外层作用域的重名符号。
http://www.xdnf.cn/news/4259.html

相关文章:

  • 【东枫科技】代理英伟达产品:智能网卡的连接线
  • 在 Win11 下安装 Wireshark 的详细步骤
  • ROS学习——IMU惯性测量单元节点的原理与编写(含C++和Python代码)
  • 【iOS】源码阅读(二)——NSObject的alloc源码
  • CSS网格布局
  • SQL 与 Python:日期维度表创建的不同选择
  • 人工智能与生命科学的深度融合:破解生物医学难题,引领未来科技革命
  • Linux远程管理
  • 2025年软件工程与数据挖掘国际会议(SEDM 2025)
  • Android 开发中JDK 的使用和配置详解
  • 机器视觉的PCB激光褪镀层的应用
  • 【基于SSM+Vue+Maven+Mysql】音乐管理系统(附源码+数据库脚本)
  • 决 策 树
  • 《深度学习实践教程》[吴微] ch-5 3/5层全连接神经网络
  • 使用Java和LangChain4j实现人工智能:从分类到生成式AI
  • CentOS 7 安装指定版本 Docker 及镜像加速/配置优化攻略
  • 候选码 主属性 非主属性
  • STM32--RCC--时钟
  • 【大模型系列篇】开启AI自主科研新时代:WebThinker开源深度研究框架
  • 还原TF卡或U盘
  • 18个国内wordpress主题推荐
  • 京东:外卖上线新功能,但仅限今天
  • NGINX `ngx_http_auth_request_module` 模块详解基于子请求的认证授权方案
  • 已经写好论文的AI率降低
  • 7系列 之 IO_FIFO
  • 大学之大:隆德大学2025.5.6
  • 分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
  • Nmap 工具的详细使用教程
  • StableDiffusionWebUI的AI绘图AI绘视频详细使用教程+报错排坑
  • 遥控器网络推拉流技术要点!