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

Cherno C++ P61 C++当中的命名空间

这篇文章我们来稍微多讲一点有关于C++当中的命名空间的内容。在上一篇文章当中,我们举了个Apple和Orange命名空间内有相同的Print函数的情况。那么在我们现实当中,其实这种有相同命名的函数/变量的需求还是很多的,因为很多函数可能功能就是类似的,命名的时候也就是类似的。但是如果有命名相同的函数定义放在一起,会发生链接错误,所以我们有了命名空间。

在C当中,是没有命名空间的,所以如果在C当中写一个库,需要用这个库的名字来作为前缀或者后缀,以此和其他库里面的函数区分开。我们之前使用过的glfw就是一个典型的例子。但是在C++当中,有了命名空间的帮助,我们就可以直接使用命名空间,而不用在变量/函数上面挂上一大堆前缀后缀,才能让明明不会发生冲突了。

命名空间的操作符就是::,这个我们在之前已经见了很多次了,这个符号的作用就是说明我们在使用这个命名空间内的变量。而之前我们讲类当中的静态方法时,也接触过这个符号。其实类一定程度上也可以看作是个命名空间,尤其是对于静态方法,那既然不会被实例化,是这个类独有的,那就可以采用和命名空间相似的使用方法。

我们前面讲到过,如果在一个文件内全使用某一个命名空间内的变量的话,可以使用

using namespace Apple;
using Apple::Print;

这两句当中哪句都可以,看使用的需求。当然我们也可以在命名空间里面嵌套命名空间:

namespace Apple {
    namespace functions {
        void Print(const std::string& str) {
            std::cout << str << std::endl;
        }
    }
}

可以看到我们套了两层,那么如果想要使用这个Print函数,我们可以用

 using Apple::functions::Print;

或者就直接用

using namespace Apple::functions;

但是如果我们用

using namespace Apple;

就会发现这是找不到Print的,因为内层命名空间内部对于外层的命名空间其实是不可见的。如果想要解决这个问题,就需要使用

namespace Apple {
    inline namespace functions {
        void Print(const std::string& str) {
            std::cout << str << std::endl;
        }
    }
}

通过inline修饰,这样内部就可见了。

以上就是这篇文章的全部内容了,希望大家能够喜欢!

相关文章:

  • K8S学习之基础五:k8s中node节点亲和性
  • Nginx1.19.2不适配OPENSSL3.0问题
  • DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)
  • 17.9 LangSmith Tracing 深度实战:构建透明可观测的大模型应用
  • 蓝桥杯刷题(Cows in a Skyscraper G,炮兵阵营)
  • ffmpeg源码编译支持cuda
  • STM32-GPIO详解
  • 主时钟与虚拟时钟约束
  • 【UCB CS 61B SP24】Lecture 19 20: Hashing Hashing II 学习笔记
  • YOLOv11融合YOLOv12中的R-ELAN结构
  • 通过continue插件实现vscode接入本地离线部署的deepseek
  • chromadb向量数据库使用 (2)
  • DeepSeek 配合 Mermaid,自动生成甘特图
  • Linux常见命令
  • Mac远程桌面软件哪个好用?
  • 服务器和本地电脑之间如何传输文件
  • 基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现(源码+数据库+文档+PPT)
  • Android视频流畅播放要素
  • 19.5、C++11新特性有哪些⑤【模板的改进】
  • 科技查新有不通过的情况吗?为什么?
  • 央行就《关于规范供应链金融业务引导供应链信息服务机构更好服务中小企业融资有关事宜的通知》答问
  • 周劼已任中国航天科技集团有限公司董事、总经理、党组副书记
  • 过去24小时中美是否就关税问题进行过接触?外交部:没有
  • “五一”假期逛上海车展请提前购票,展会现场不售当日票
  • 工行一季度净赚841亿元降3.99%,营收降3.22%
  • 对谈|李钧鹏、周忆粟:安德鲁·阿伯特过程社会学的魅力