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

【c++】c++第一课:命名空间

文章目录

  • 1.C++的第⼀个程序
  • 2.命名空间
    • 2.1 namespace的价值
    • 2.2 namespace的定义
    • 2.3 命名空间使⽤

最新的c++标准(建议收藏)

1.C++的第⼀个程序

C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的helloworld依旧可以运⾏,C++中需要把定义⽂件代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译

#include<stdio.h> 
int main() 
{ printf("hello world\n");  return 0; 
}

当然C++有⼀套⾃⼰的输⼊输出,严格说C++版本的helloworld应该是这样写的:

#include<stdio.h> 
using namespace std; 
int main() 
{ cout << "hello world\n" << endl;  return 0; 
}

2.命名空间

2.1 namespace的价值

在C/C++中,变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。

同一作用域不可重复定义同个变量

使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现可以解决这个问题

//rand在全局作用域出现两次
#include<stdio.h>     
#include<stdlib.h>//包含rand函数  
int rand = 10;//新的全局变量 
int main() 
{ // 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”  printf("%d\n", rand);//不知打印哪个 return 0; 
}

2.2 namespace的定义

• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了

• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所以如果有了域隔离,名字冲突就解决了(局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期)

namespace只能定义在全局而且还可以嵌套定义

• 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突

C++标准库都放在⼀个叫std(standard)的命名空间中

#include<stdio.h>     
#include<stdlib.h>  
// 1. 正常的命名空间定义  
namespace name 
{ // 命名空间中可以定义变量/函数/类型  int rand = 10; int Add(int left, int right) { return left + right; } struct Node { struct Node* next; int val; }; 
} 
int main() 
{ // 这⾥默认是访问的是全局的rand函数指针//编译器语法查找确认,默认先局部查找->全局查找//::域作用限定符printf("%p\n", rand); // 这⾥指定name命名空间中的rand//编译器语法查找确认,指定作用域,就直接去这个域查找->没有找到就报错未声明的标识符printf("%d\n", bit::name); return 0; 
}
//2. 命名空间可以嵌套  
namespace name 
{  namespace wl{ int rand = 1; int Add(int left, int right) { return left + right; } }  namespace wll{ int rand = 2; int Add(int left, int right) { return (left + right)*10; } } 
} 
int main() 
{ printf("%d\n", name::wl::rand); printf("%d\n", name::wll::rand); printf("%d\n", name::wl::Add(1, 2)); printf("%d\n", name::wll::Add(1, 2)); return 0; 
} 

在这里插入图片描述

2.3 命名空间使⽤

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

• 指定命名空间访问,项⽬中推荐这种⽅式。

• using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。

• 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

#include<stdio.h>     
namespace bit 
{ int a = 0; int b = 1; 
} 
int main() 
{ // 编译报错:error C2065: “a”: 未声明的标识符  printf("%d\n", a); return 0; 
}
// 指定命名空间访问  
int main() 
{ printf("%d\n", N::a); return 0;  
} 
// using将命名空间中某个成员展开  
using N::b; 
int main() 
{ printf("%d\n", N::a); printf("%d\n", b); return 0;  
} 
// 展开命名空间中全部成员  
using namespce N; 
int main() 
{ printf("%d\n", a); printf("%d\n", b); return 0;  
} 

注意:允许存在未命名的空间

#include<stdio.h>
namespace
{int a = 0; int b = 1; 
}
int main()
{printf("%d",a);
}

文章转载自:

http://fc2RNAll.crrmg.cn
http://JlH2W2qd.crrmg.cn
http://uSh2jMZH.crrmg.cn
http://21osIFyn.crrmg.cn
http://idyqQNG7.crrmg.cn
http://CV6bELQp.crrmg.cn
http://AdasH4io.crrmg.cn
http://IHgez1oX.crrmg.cn
http://s9CLQi8H.crrmg.cn
http://7CB0SwOJ.crrmg.cn
http://sJaDsvxj.crrmg.cn
http://heYD5ID5.crrmg.cn
http://t1pfqi9L.crrmg.cn
http://VZbNye3j.crrmg.cn
http://9HxUlMZ8.crrmg.cn
http://5z1njLvP.crrmg.cn
http://4j474o6I.crrmg.cn
http://nQ3ks4ix.crrmg.cn
http://aKj0P3JR.crrmg.cn
http://7eh8QM59.crrmg.cn
http://sZLe0Rqu.crrmg.cn
http://6ziRrvDO.crrmg.cn
http://W2YD8Gqp.crrmg.cn
http://vaZb2ED7.crrmg.cn
http://mOmYDSM0.crrmg.cn
http://0QX1WijR.crrmg.cn
http://UhBQTUfc.crrmg.cn
http://N7aMJl7E.crrmg.cn
http://pLjVXd8g.crrmg.cn
http://Wuz38BIt.crrmg.cn
http://www.dtcms.com/a/369279.html

相关文章:

  • Graphpad 绘图(二):小鼠生存曲线绘制与数据记录分析详解
  • DNS基本功能搭建
  • C++Primerplus 编程练习 第十二章
  • 看见世界的另一种可能:Deepoc星眸(StarGaze)如何为视障生活带来曙光
  • Springboot实现国际化(MessageSource)
  • 告别Qt Slider!用纯C++打造更轻量的TpSlider组件
  • 数字孪生赋能:智能制造如何实现从“经验驱动”到“数据驱动”?
  • 穿越市场迷雾:如何在经济周期中保持理性与长期视角
  • Mac M4环境下基于VMware Fusion虚拟机安装Ubuntu24.04 LTS ARM版
  • Vue基础知识-脚手架开发-使用Axios发送异步请求+代理服务器解决前后端分离项目的跨域问题
  • 苍穹外卖 day03
  • 【学习笔记】解决 JWT 解析报错:Claims claims = JwtUtil.parseJWT(...) Error Code 401(token过期)
  • linux下快捷删除单词、行的命令
  • AI提示词增强丨用EARS语法进行产品原子化拆解
  • 概率论第三讲——多维随机变量及其分布
  • 重大更新Claude更新用户协议把中国列为敌对国家
  • 移植Qt4.8.7到ARM40-A5
  • C++语言编程规范-初始化和类型转换
  • Gartner发布2025年数据安全领域的先锋厂商:GenAI和量子计算时代的数据安全创造性技术、产品和服务
  • 微前端架构:解构前端巨石应用的艺术
  • uniapp开发前端静态视频界面+如何将本地视频转换成网络地址
  • EI会议:第三届大数据、计算智能与应用国际会议(BDCIA 2025)
  • 9.5C++作业
  • 数据库基础知识——聚合函数、分组查询
  • MySQL 综合练习
  • 基于cornerstone3D的dicom影像浏览器 第三章 拖拽seriesItem至displayer上显示第一张dicom
  • 用户眼中的VR自来水厂之旅
  • 数据安全成焦点:基于Hadoop+Spark的信用卡诈骗分析系统实战教程
  • 瑞芯微RV1126目标识别算法Yolov8的部署应用
  • 【深入理解Batch Normalization(1)】原理与作用