学习笔记 · Obsidian
读懂板卡库所需的 C++
什么时候插入 C++
能看懂 C 的数据结构和指针后,就可以学一点 C++ 来读板卡库。ESP-IDF 主要提供 C API,也支持 C++ 应用;不需要先完成一整套 C++ 课程。ESP-IDF C++ Support
| 概念 | 本轮要理解到什么程度 | CoreS3 场景 |
|---|---|---|
class | 把数据和操作组织在一起 | 屏幕对象的初始化与绘图方法 |
| 构造、析构 | 建立和释放对象持有的资源 | 驱动句柄、缓冲区、锁的生命周期 |
引用 T& | 已有对象的别名 | 原地更新配置,读懂库函数签名 |
namespace | 名称归属 | 区分不同库的类型与函数 |
template | 按类型或常量生成代码 | 读懂 std::array<uint8_t, 16> |
| STL 最小集 | 定长容器与动态容器的差异 | 先了解 array,再评估 vector、string 的分配 |
| RAII | 用对象生命周期管理资源 | 正常离开作用域时自动释放资源 |
这是课程安排。它把资源所有权放在前面,暂缓复杂继承、模板元编程、协程。
RAII 怎样减少遗漏
例如函数获取锁后,后面可能因校验失败提前 return。手写释放很容易漏掉一个分支。一个拥有锁的局部对象,可以在析构时释放锁,让正常退出路径共享清理逻辑。资源所有权、生命周期与作用域的关系见 C++ Core Guidelines R.1。
不过,复位、断电、强行删除任务不会帮你完成所有 C++ 析构。设备仍需设计恢复流程,不能靠 RAII 解决断电一致性。
C 和 C++ 可以在同一个工程合作
应用入口在 .c 中通常写 void app_main(void);在 .cpp 中需要 C 链接:
extern "C" void app_main(void)
{
// 调用应用初始化函数。
}
对外提供 C 接口的头文件,要用 #ifdef __cplusplus 包住 extern "C" 声明。不要把“把文件后缀从 .c 改为 .cpp”当作完成迁移;初始化语法和类型规则可能不同。ESP-IDF C/C++ 混合编程
本文引用的 IDF v5.5.1 文档记载默认 C++ 方言为 gnu++23,异常和 RTTI 默认关闭。这是指定版本的工具链行为,不能推断其他版本或 Arduino 工程也完全相同。
练习与边界
阅读 M5Unified 的一个官方例子,找出对象、方法调用、配置结构和引用参数。只解释调用关系,先不要改库内部实现。M5Unified 官方仓库
过关标准:能回答“这个对象拥有资源吗、复制它会发生什么、哪个调用会动态分配、错误如何返回”。完成这些后再决定是否需要更复杂的语言能力。