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

C++命名空间深度解析

1.命名空间的价值

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

举个例子:

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

这是一个正确的C语言代码(但并不推荐这种写法),局部变量rand覆盖了全局变量的数值,能够正确运行。但是只要加入一个头文件,就会使程序运行错误,看:
在这里插入图片描述
报错信息显示,rand被重定义了,因为标准库中已经有一个名为rand()的函数(用于生成随机数)。为了避免这种情况,C++语言引进了namespace关键字。

2. namespace定义

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

namespace hhy
{int rand = 1;int Add(int x, int y){return x + y;}struct Stu{int age;char name[10];};
}

这是一个简单的命名空间,定义了一个变量,函数和结构体。

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

#include<stdio.h>
//#include<stdlib.h>int rand = 10;namespace hhy
{int rand = 1;int Add(int x, int y){return x + y;}struct Stu{int age;char name[10];};
}int main()
{printf("%d\n", hhy::rand);//在hhy命名空间寻找rand变量printf("%d\n", ::rand);//在全局变量中寻找rand变量return 0;
}

在 C 和 C++ 中,:: 是作用域解析运算符,用于访问全局作用域或特定命名空间中的标识符。
在这里插入图片描述
注意:这里将#include<stdlib.h>给注释了,不然第二次打印会报错,跟rand函数冲突,但第一次打印可以正常运行,大家可以去试一试。

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

#include <iostream>
using namespace std;// 全局作用域:变量lifeGlobal的生命周期从程序启动到结束
int lifeGlobal = 1;// 命名空间作用域:变量lifeNS的生命周期同样贯穿程序全程
namespace MyNS {int lifeNS = 2;
}// 类作用域:静态成员变量lifeStatic属于类本身,而非类的实例
class MyClass {
public:static int lifeStatic;  // 声明静态成员变量
};
// 定义并初始化静态成员变量(在全局/静态存储区分配内存)
int MyClass::lifeStatic = 3;// 测试函数:展示局部变量的生命周期
void testScopes() {// 局部作用域:变量lifeLocal的生命周期从函数调用开始,到函数返回时结束int lifeLocal = 4;cout << "Inside function: " << lifeLocal << endl;  // 输出局部变量值// lifeLocal在此处销毁
}int main() {// 访问全局变量(直接使用变量名)cout << "Global: " << lifeGlobal << endl;// 访问命名空间变量(通过命名空间限定符)cout << "Namespace: " << MyNS::lifeNS << endl;// 访问类静态成员(通过类名限定符)cout << "Class static: " << MyClass::lifeStatic << endl;// 调用函数,创建并销毁局部变量testScopes();// 函数调用结束后:cout << "After function call:" << endl;// 全局变量、命名空间变量和类静态成员仍然有效cout << "Global: " << lifeGlobal << endl;cout << "Namespace: " << MyNS::lifeNS << endl;cout << "Class static: " << MyClass::lifeStatic << endl;return 0;
}

在这里插入图片描述

• namespace只能定义在全局,当然他还可以嵌套定义。

#include<iostream>
using namespace std;namespace hhy
{int num1 = 10;namespace ty{int num2 = 20;}
}int main()
{cout << hhy::tsy::num2 << endl;
}

上图我在hhy命名空间里嵌套定义了ty命名空间,程序可以正确打印20。

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

在这里插入图片描述

在上面图片,我定义了math.h,math.cpp,test.cpp三个文件,在文件中分别定义了Calc命名空间,程序是可以正确运行的,定义重名命名空间并不会使程序发生错误。

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

std 是 C++ 标准库的官方命名空间,它将标准库的所有内容(如 cout、endl、vector 等)封装起来,防止污染全局作用域。
如果不使用 using namespace stdstd:: 限定符,编译器会认为 cout 等标识符未定义,导致编译错误。

3. 命名空间使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错。

#include<stdio.h>
namespace N
{int a = 0;int b = 1;
}
int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);return 0;
}

所以我们要使用命名空间中定义的变量/函数,有三种方式:
• 指定命名空间访问,项目中推荐这种方式。
• using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
• 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习推荐使用。

#include<stdio.h>
namespace N
{int a = 1;int b = 2;
}//指定命名空间访问
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 namespace N;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

相关文章:

  • 功能丰富的PDF处理免费软件推荐
  • 如何实现告警的自动化响应?
  • Java求职者面试题详解:Spring、Spring Boot、MyBatis技术栈
  • PyTorch——DataLoader的使用
  • Java八股文智能体——Agent提示词(Prompt)
  • IDEA,Spring Boot,类路径
  • 论文阅读(六)Open Set Video HOI detection from Action-centric Chain-of-Look Prompting
  • Linux 学习-模拟实现【简易版bash】
  • 从单机到集群,再到分布式,再到微服务
  • Java String 详细教程
  • 模块联邦:更快的微前端方式!
  • 002 dart刷题
  • 数据结构:递归(Recursion)
  • 【AI论文】R2R:通过小型与大型模型之间的令牌路由高效导航发散推理路径
  • vue-10( 动态路由匹配和路由参数)
  • Linux线程同步实战:多线程程序的同步与调度
  • 数据库系统概论(十)SQL 嵌套查询 超详细讲解(附带例题表格对比带你一步步掌握)
  • Client-Side Path Traversal 漏洞学习笔记
  • 【Java学习笔记】注解
  • 接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测
  • 网站开发展示/网站生成
  • 企业网站建设哪家好/nba最新交易动态
  • 做网站分几步/独立站seo
  • 如何防止网站挂马/宁波正规seo快速排名公司
  • 网站后台ftp账户/抖音竞价推广怎么做
  • 重庆网站制作公司/seo优化专员招聘