学习笔记 · Obsidian

读懂板卡库所需的 C++

ESP-IDFC / 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 官方仓库

过关标准:能回答“这个对象拥有资源吗、复制它会发生什么、哪个调用会动态分配、错误如何返回”。完成这些后再决定是否需要更复杂的语言能力。


返回学习入口 · 来源与版本