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

【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://www.xdnf.cn/news/20186.html

相关文章:

  • uni-app 项目 iOS 上架效率优化 从工具选择到流程改进的实战经验
  • 从零开始的python学习——字典
  • 永磁同步电机负载估计算法--非线性扩张状态观测器
  • 看见世界的另一种可能:Deepoc星眸(StarGaze)如何为视障生活带来曙光
  • Onlyoffice集成与AI交互操作指引(Iframe版)
  • 美团发布 | LongCat-Flash最全解读,硬刚GPT-4.1、Kimi!
  • 标签系统的架构设计与实现
  • Oracle软件在主机平台的应用(课程下载)
  • 请求超过Spring线程池的最大线程(处理逻辑)
  • 企业级项目管理方法设计指南
  • Scikit-learn Python机器学习 - 特征预处理 - 标准化 (Standardization):StandardScaler
  • 音视频面试题集锦第 38 期
  • 电影级文字生视频核心代码手册
  • CASToR 生成的文件进行转换
  • 1.数据库介绍
  • java面试:有了解过数据库事务吗,能详细讲一讲么
  • 四川地区燃气从业人员考试题库及答案
  • Redis中的hash数据类型
  • 在LangChain中无缝接入MCP服务器扩展AI智能体能力
  • 从零开始的云计算生活——第五十九天,基于Jenkins自动打包并部署Tomcat环境
  • 浅析多模态标注对大模型应用落地的重要性与标注实例
  • 图像的几种成像方式简介
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十六)windows平台运行时隐藏控制台
  • 手把手教你用Go打造带可视化的网络爬虫
  • Day36 IO多路复用技术
  • Docker Desktop 安装 wsl问题
  • android 四大组件—Activity源码详解
  • 沪深300股指期权包含上证50期权吗?
  • Chatwith:定制你的AI 聊天机器人
  • 如何从chrome中获取会话id