---
type: study
status: active
created: 2026-09-10
updated: 2026-09-10
sensitivity: private
tags: [study, embedded, c, esp32, cores3]
sources:
  - "https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-guides/cplusplus.html"
  - "https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-raii"
  - "https://github.com/m5stack/M5Unified"
---
# 读懂板卡库所需的 C++

## 什么时候插入 C++

能看懂 C 的数据结构和指针后，就可以学一点 C++ 来读板卡库。ESP-IDF 主要提供 C API，也支持 C++ 应用；不需要先完成一整套 C++ 课程。[ESP-IDF C++ Support](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-guides/cplusplus.html)

| 概念 | 本轮要理解到什么程度 | CoreS3 场景 |
| --- | --- | --- |
| `class` | 把数据和操作组织在一起 | 屏幕对象的初始化与绘图方法 |
| 构造、析构 | 建立和释放对象持有的资源 | 驱动句柄、缓冲区、锁的生命周期 |
| 引用 `T&` | 已有对象的别名 | 原地更新配置，读懂库函数签名 |
| `namespace` | 名称归属 | 区分不同库的类型与函数 |
| `template` | 按类型或常量生成代码 | 读懂 `std::array<uint8_t, 16>` |
| STL 最小集 | 定长容器与动态容器的差异 | 先了解 `array`，再评估 `vector`、`string` 的分配 |
| RAII | 用对象生命周期管理资源 | 正常离开作用域时自动释放资源 |

这是课程安排。它把资源所有权放在前面，暂缓复杂继承、模板元编程、协程。

## RAII 怎样减少遗漏

例如函数获取锁后，后面可能因校验失败提前 `return`。手写释放很容易漏掉一个分支。一个拥有锁的局部对象，可以在析构时释放锁，让正常退出路径共享清理逻辑。资源所有权、生命周期与作用域的关系见 [C++ Core Guidelines R.1](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-raii)。

不过，复位、断电、强行删除任务不会帮你完成所有 C++ 析构。设备仍需设计恢复流程，不能靠 RAII 解决断电一致性。

## C 和 C++ 可以在同一个工程合作

应用入口在 `.c` 中通常写 `void app_main(void)`；在 `.cpp` 中需要 C 链接：

```cpp
extern "C" void app_main(void)
{
    // 调用应用初始化函数。
}
```

对外提供 C 接口的头文件，要用 `#ifdef __cplusplus` 包住 `extern "C"` 声明。不要把“把文件后缀从 `.c` 改为 `.cpp`”当作完成迁移；初始化语法和类型规则可能不同。[ESP-IDF C/C++ 混合编程](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-guides/cplusplus.html#combining-c-and-c-code)

本文引用的 IDF v5.5.1 文档记载默认 C++ 方言为 `gnu++23`，异常和 RTTI 默认关闭。这是指定版本的工具链行为，不能推断其他版本或 Arduino 工程也完全相同。

## 练习与边界

阅读 M5Unified 的一个官方例子，找出对象、方法调用、配置结构和引用参数。只解释调用关系，先不要改库内部实现。[M5Unified 官方仓库](https://github.com/m5stack/M5Unified)

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

---

[[Study/embedded-cores3/CoreS3学习入口|返回学习入口]] · [[Study/embedded-cores3/CoreS3资料来源与版本|来源与版本]]
