【C++语言】冲突-C语言:命名空间

简介: 【C++语言】冲突-C语言:命名空间

前言

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


1.命名空间:

C语言没有办法解决下图中的命名冲突问题,所以C++提出了namespace关键字来解决

dd2f40c263ed0081b805f80e6da63341_bbbaedad813b43c3bdc3edd0cee5c3d3.png

比如:这里我想定义一个rand变量,但与库中的函数rand重名,C语言里就直接报错,没有办法。那C++有什么办法吗?有的,就是namespace关键字!


namespace关键字

这里我们就直接来展示下:

4ff070dccd6ef4d69beca0defebf5e75_b9191a841c244d989b7a6a1a079a2beb.png

这里就相当于于直接访问了我们设置的空间里的rand,非常准确,避免了和库里的函数rand命名冲突


  • 具体来解释下:我们要先认识这个符号:: 叫做域作用限定符,在这里C::相当于是明确地方:C空间中的rand。
  • 那么我们提出一个问题:我们知道C语言中局部变量和全局变量,优先访问局部,那C++有办法解决吗?
  • 答案是肯定的:如下例子

3a57f5e1083b665edf1f9a1f296d5747_00822afb352d416e87b4aaa51c5a1964.png

  • 这里我们直接在::域作用限定符前为空的,就可以优先访问全局变量。

上面就简单举了两个例子来说明了一下,接下来我们就进一步学习namespace关键字:

1.命名空间中可以定义变量、函数、类型

namespace C
{
  //变量:
  int a = 10;
  
  //函数:
  int Add(int left, int right)
  {
  return left + right;
  }
  
  //类型:结构体
  struct Node
  {
  struct Node* next;
  int val;
  };
}

2.命名空间可以嵌套

namespace C1
{
  //变量:
  int a = 10;
  
  //函数:
  int Add(int left, int right)
  {
  return left + right;
  }
  //嵌套命名空间:
  namespace C2
  {
    int a=20;
  }
}
  • 嵌套命名空间的访问:比如这里我要访问C2的aC1::C2::a

3.相同命名空间共存

在一个工程中,比如在test.cpp和test.h文件中都有N1命名空间,那么会将两个文件的同名空间整合

2 命名空间的使用方式:

1.名称加用域作用限定符的方式访问(同上)

2.使用using引入某个空间中的某个变量

如图,我们用了using引入了C中的b,就可以直接访问量

3.使用using引入展开某个空间

同样可以实现直接访问变量b。

  • 当然这里需要强调一下,直接全部展开会有风险,如果我们定义的命名空间和库里的重名也会报错的。

总结

关于C语言和C++的一些冲突,命名上就是突出的一点,C语言无法解决,所以C++提出方案。

  • 命名空间的介绍,以及namespace关键字的使用
  • 命名空间的三个特点
  • 命名空间的使用方法

C++语言系列学习目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加,添加超链接

相关文章
|
5天前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开
|
13天前
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
|
18天前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
15 0
|
19天前
|
自然语言处理 C语言 C++
程序与技术分享:C++写一个简单的解析器(分析C语言)
程序与技术分享:C++写一个简单的解析器(分析C语言)
|
21天前
|
Unix 编译器 C语言
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
12 0
|
22天前
|
编译器 C语言 C++
【C++】:C++关键字,命名空间,输入&输出,缺省参数
【C++】:C++关键字,命名空间,输入&输出,缺省参数
22 0
|
22天前
|
程序员 C语言 C++
【C语言】:柔性数组和C/C++中程序内存区域划分
【C语言】:柔性数组和C/C++中程序内存区域划分
14 0
|
22天前
|
存储 编译器 开发工具
C++语言教程分享
C++语言教程分享
|
22天前
|
自然语言处理 编译器 C语言
C++语言入门教程
C++语言入门教程
|
22天前
|
存储 编译器 程序员
C++语言基础学习
C++语言基础学习