--- tags: [source-summary] type: source source: "C语言OOP封装完整系列 (B站视频课程)" author: "500强11年嵌入式工程师" date: 2026-05-05 url: "" created: 2026-07-23 updated: 2026-07-25 --- # C语言OOP封装完整系列 — 资料摘要 > 原始资料:`raw/Joplin/嵌入式+Linux/C语言OOP封装完整系列/`,包含课程资料与整理后的 `c-oop.md` 学习指南。 > 主题:用纯 C 语言实现面向对象编程的封装、继承、多态三大特性,最终构建嵌入式四层架构。 ## 核心脉络 整个系列从**一个 LED 驱动**出发,逐步演化出完整的 C-OOP 架构: ```text 原始重复代码 → struct 封装(数据结构化) → static 信息隐藏(模块内聚) → 头文件/源文件分离(接口与实现隔离) → 模块前缀规范(命名空间模拟) → init/deinit 生命周期(构造函数/析构函数模拟) → 基类嵌套(继承模拟) → 函数指针传参(策略模式) → ops 操作表(虚函数表模拟) → vptr 嵌入对象(多态就绪) → container_of 向下转型 → 四层架构(基类/子类/板级绑定/应用) → module_init 自动注册(Linux 内核风格) ``` ## 关键知识点索引 | 知识点 | 核心作用 | 对应 C 语法/模式 | |--------|---------|-----------------| | 封装 | 数据+操作绑定,隐藏实现细节 | `struct` 组织数据,`static` 限制作用域 | | 继承 | 复用公共字段和行为 | 基类 `struct` 作为子类**第一个成员**嵌套 | | 多态 | 同一接口不同实现 | 函数指针 `void (*on)(base*)` + vtable | | 信息隐藏 | 阻止外部直接访问数据 | `static` 函数+变量,头文件只暴露接口 | | 命名空间 | 避免符号冲突 | 模块前缀 `led_`、`gpio_` | | 生命周期 | 规范化初始化和清理 | `init()` / `deinit()` 配对 | | 向上转型 | 子类指针→基类指针 | 直接取 `&obj.base` | | 向下转型 | 基类指针→子类指针 | `container_of` 宏 | | 虚函数表 | 运行时多态调度 | `struct LedOps` 存函数指针 + 对象内嵌 `ops*` | | 纯虚函数 | 强制子类实现 | `assert(me->ops->on != NULL)` | | 延迟绑定 | 运行时决定调用哪个函数 | 函数指针赋值 + 间接调用 | | 自动注册 | 模块无需修改主函数 | `__attribute__((section()))` + 链接脚本 | ## 2026-07-25 修订要点 - `c-oop.md` 中的 Student、RingBuffer、继承、多态、Stream、四层架构示例已改为按真实文件拆分的代码块(`.h` / `.c` / `main.c`),复制后可直接新建文件编译。 - 示例均按 `gcc -std=c11 -Wall -Wextra -Werror -pedantic` 抽取编译并运行验证。 - 修正不透明类型不能在外部栈上实例化、`strncpy` 需要手动补 `'\0'`、GNU C 扩展不可当作标准 C11 等容易误导的点。 ## 四层架构 ``` 第1层: led_base.h/c — 基类 (name, state, ops*) 第2层: led_gpio.c/pwm.c — 子类实现 (嵌套 base + 私有数据) 第3层: board_init.c — 板级绑定 (实例化+初始化+暴露全局指针) 第4层: app.c — 应用层 (只通过全局指针操作) ``` ## Linux 内核对应 - `struct file_operations` = LedOps(操作表) - `container_of` = 向下转型宏 - `module_init` = `__attribute__((section(".initcall6.init")))` - `i2c_algorithm` = 协议层 ops - `gpio_chip` = 硬件抽象 ops ## 关键宏 ```c #include #define container_of(ptr, type, member) \ ((type *)((char *)(ptr) - offsetof(type, member))) ``` 说明:用户态教学示例使用标准 C11 形式;Linux 内核版本会结合 GNU C 扩展做类型检查,并提供 `container_of_const()` 保留 `const` 限定。 ## 参考关联 - `raw/Joplin/嵌入式+Linux/C语言OOP封装完整系列/c-oop.md` — 完整指南 - [[继承与多态]] — C++ 的 OOP 实现对比 - [[C++类与对象]] — C++ class 底层原理