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

C++ 编译链接杂谈——前向声明

在我之前的文章《C++ 编译链接杂谈》中介绍了为什么对同一个函数/变量的声明可以在多个文件中多次出现,让人觉得 #include 头文件是一件比较随意的事情,不容易出问题。事实上,在 .cpp 中 #include 头文件确实比较随意,但是在 .hpp 中 #include 头文件还是需要考虑一些问题,本篇就讨论这些问题和解决这些问题的办法。

头文件循环引用

我要说的问题是头文件循环引用。我在最近编程的过程中,在针对一个类编写头文件时,如果用到了其他的类,我就不经思考地把那个类的头文件 #include 进来。一开始这么做没什么问题,后来我设计了两个类,他们的声明中互相用到了对方。在我依然 #include 对方的头文件后,就出了头文件循环引用的问题。

// coroutine.h#include "connection.h"// connection.h#include "coroutine.h"

无限递归的可能性

由于编译器会在预处理过程中将 #include 替换为头文件文本,如果你没有用 #ifndef 的方式避免重复 #include 同一个头文件,那么上面的头文件循环引用情形就会导致编译器永远替换不完 #include。

类型未定义的错误

如果你用 #ifndef 避免了重复 #include 的错误,依然有问题。比如但看 coroutine.h 头文件,当预处理时吧 connection.h 头文件替换进来后,conn.h 内部用到了 coroutine 类型,而该类型的定义在替换进来的头文件下面。这就引起了类型未定义的错误。

前向声明

// coroutine.hclass connection; // 这条语句就是前向声明

如果我们不 #include 其他头文件,而只是用前向声明的方式声明那个被依赖的类,就解开了互相依赖的循环。但前向声明也有局限,它不是完整定义,使用前向声明的头文件只能使用这个类的引用、指针,因为它(编译它的编译器)不知道这个类的大小、具体方法、属性等。

编写头文件时的讲究

上述问题提醒我们,在编写头文件时,首先最好不要有循环依赖的场景。如果非要有最好也是以指针的形式依赖,也不要随意 #include 其他头文件。换个角度,如果当你在 .cpp 文件中引入一个 .h 文件后,你发现你不知道有哪些 .h 文件被包含在了这个 .h 文件中,是不是也不太爽。是不是对这个程序都引用了哪些功能失去了掌控?所以一个头文件还是专注于自己的声明,不要引入其他乱七八糟的声明为好。

http://www.dtcms.com/a/350887.html

相关文章:

  • JavaScript 类中静态变量与私有变量的区别及用法
  • eniac:世界上第一台通用电子计算机的传奇
  • 开发避坑指南(36):Java字符串Base64编码实战指南
  • 深度学习-----《PyTorch深度学习核心应用解析:从环境搭建到模型优化的完整实践指南》
  • 初步了解多线程
  • 交换机是如何同时完成帧统计与 BER/FEC 分析的
  • 【应急响应工具教程】SPECTR3:通过便携式 iSCSI 实现远程证据的只读获取与分析
  • [pilot智驾系统] 模型守护进程(modeld)
  • rbio1:以生物学世界模型为软验证器训练科学推理大语言模型
  • 面试八股文之——JAVA基础
  • 深度学习梯度下降与交叉熵损失
  • 重塑企业沟通与增长:云蝠智能大模型如何成为您的智能语音中枢
  • 大模型(一)什么是 MCP?如何使用 Charry Studio 集成 MCP?
  • SQL查询-设置局部变量(PostgreSQL、MySQL)
  • 嵌入式学习 day58 驱动字符设备驱动
  • 玳瑁的嵌入式日记D25-0825(进程)
  • Java全栈开发实战:从Spring Boot到Vue3的项目实践
  • Android Glide 缓存机制深度解析与优化:从原理到极致实践
  • 集成电路学习:什么是ONNX开放神经网络交换
  • 深度学习③【卷积神经网络(CNN)详解:从卷积核到特征提取的视觉革命(概念篇)】
  • 详解 Transformer 激活值的内存占用公式
  • SOME/IP-SD报文中 Entry Format(条目格式)-理解笔记5
  • 算法题记录01:
  • 0826xd
  • Trip Footprints 旅行App开发全流程解析
  • UALink是什么?
  • 数字化转型:概念性名词浅谈(第四十二讲)
  • 牛客周赛 Round 106(小苯的方格覆盖/小苯的数字折叠/ 小苯的波浪加密器/小苯的数字变换/小苯的洞数组构造/ 小苯的数组计数)
  • 撤回git 提交
  • 算法训练营day62 图论⑪ Floyd 算法精讲、A star算法、最短路算法总结篇