source-c-oop.md 3.8 KB


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 架构:

原始重复代码
  → 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

关键宏

#include <stddef.h>

#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 底层原理