# LayeredPrograms **Repository Path**: GKoSon/layeredPrograms ## Basic Information - **Project Name**: LayeredPrograms - **Description**: C语言小函数演示工程项目的分层解耦 核心技术 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-12 - **Last Updated**: 2026-05-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # layeredPrograms 本项目抽象一个最简单的核心模型 演示通用的 基于函数指针的 工程分层解耦 ## 如何使用 本项目一共只有两次提交[补充:20260515 第三次提交 收纳到上下文或者说句柄] ### 传统写法 回滚到第一次提交:传统写法 这是老一代耦合代码的演示 ```bash gcc main.c modeA.c modeB.c ``` 执行看效果 然后修改宏USE_A 再次执行看效果 传统做法是集体modeX被main.c调用 全部.C都会耦合在一起 ### 现代写法 回滚到第二次提交:现代写法 这是本案要演示的做法 ``` ├── main.c - 主程序入口 ├── choice.c - 函数注册与模式选择实现 ├── choice.h - 函数指针类型定义和函数声明 ├── modeA.c - ModeA 功能实现 ├── modeA.h - ModeA 函数声明 ├── modeB.c - ModeB 功能实现 └── modeB.h - ModeB 函数声明 ``` ```bash gcc -o program main.c choice.c modeA.c modeB.c ``` ```bash ./program ``` 中间做了一层choice 由它负责选择那个模块 应用main.c只需#include choice ### 传统对比现代 ![1778635003154](images/README/1778635003154.png) ## 核心核心核心 **传统做法** APP.C要使用MODX.C的函数 那么就是`APP.C冠以#include MODX.h` 再直接使用函数即可 **现代做法**倒骑驴 APP.C不需要#include MODX.h 而是反过来 `在MODX.C冠以#include APP.h` 因为APP.C写法是预留的完形填空 (比如状态机在恰当的时候去调用某某某函数) 这个某某某函数就是需要完型填空的 APP.C使用空函数临时占据位置 真正填空的是MODX.C的实现 而 APP.H给一个registerFunction函数 让MODX.C去把实现完型填空进来 就是这个奥秘 ## 工作原理 1. **函数指针类型** (`commonFunction`):定义了一个通用的无参无返回值的函数类型 2. **注册机制** (`registerFunction`):允许将不同的函数注册到系统中 3. **模式选择** (`modeChoice`):根据传入的参数选择并执行对应的功能 通过 `main.c` 中的 `#define USE_A` 宏定义,可以选择在编译时使用不同的功能模块。 ## 更多细节 https://mp.weixin.qq.com/s/7E79mhfTTXV1JQTKbaYFqg https://mp.weixin.qq.com/s/PVpYSocjvlMpoanuXNtSaA ## 更上一层楼 **现代做法**再次升级变成**主流做法** >其一因为约定函数的规范容易需要参数很多 不便于修改 主流是统一传 上下文或者说句柄 >其二东土 ST等BSP都是我这种句柄写法了 具体看第三次提交 数据+函数 收纳到结构体 最后数据可以作为参数流转起来