当前位置: 首页 > article >正文

C 语言面向对象风格封装的经典技巧(STM32F1 标准库实现)

“把函数装进结构体把结构体装进函数”是 C 语言中实现面向对象风格封装的经典技巧。它通过结构体容纳函数指针模拟“方法”再通过一个工厂函数返回该结构体的实例模拟“对象”从而将数据与操作绑定并隐藏具体实现。更换硬件时只需修改工厂函数内部的函数指针绑定调用方代码完全不变。一、核心思想函数装进结构体定义一个结构体其中包含多个函数指针成员这些指针指向与该模块相关的操作函数如init、on、off、toggle。这相当于定义了一个“接口”或“虚表”。结构体装进函数编写一个初始化/工厂函数在该函数内部定义该结构体类型的局部变量。将函数指针指向具体的硬件操作函数这些函数可以是static的对外不可见。返回该结构体或返回其指针调用方通过这个结构体来调用操作。效果调用方只看到结构体中的函数指针不知道底层是 GPIO、PWM 还是其他硬件。更换硬件时只需修改工厂函数内部的函数指针映射无需修改任何调用代码。二、示例可更换硬件的 LED 模块下面以 LED 控制为例展示如何将LED_On,LED_Off,LED_Toggle封装进结构体再通过一个函数返回该结构体。1. 定义接口结构体放在头文件中// led_interface.h#ifndef__LED_INTERFACE_H#define__LED_INTERFACE_Htypedefstruct{void(*init)(void);void(*on)(void);void(*off)(void);void(*toggle)(void);}LED_Ops;// 工厂函数返回封装了具体操作的 LED_Ops 结构体LED_OpsLED_Create(void);#endif2. 实现具体硬件操作隐藏在 .c 文件中// led_stm32.c (使用 STM32 标准库)#includeled_interface.h#includestm32f10x.h// 具体硬件配置更换硬件时只改这里#defineLED_PORTGPIOB#defineLED_PINGPIO_Pin_5#defineLED_PORT_CLKRCC_APB2Periph_GPIOB#defineLED_ON_LEVELBit_RESET// 低电平点亮#defineLED_OFF_LEVELBit_SET/* 前向声明所有静态函数 */staticvoidhw_init(void);staticvoidhw_on(void);staticvoidhw_off(void);staticvoidhw_toggle(void);// 内部实现函数static对外不可见staticvoidhw_init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(LED_PORT_CLK,ENABLE);GPIO_InitStructure.GPIO_PinLED_PIN;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(LED_PORT,GPIO_InitStructure);hw_off();// 初始熄灭}staticvoidhw_on(void){GPIO_WriteBit(LED_PORT,LED_PIN,LED_ON_LEVEL);}staticvoidhw_off(void){GPIO_WriteBit(LED_PORT,LED_PIN,LED_OFF_LEVEL);}staticvoidhw_toggle(void){GPIO_WriteBit(LED_PORT,LED_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED_PORT,LED_PIN)));}// 工厂函数实现将具体函数指针装入结构体并返回LED_OpsLED_Create(void){LED_Ops ops;ops.inithw_init;ops.onhw_on;ops.offhw_off;ops.togglehw_toggle;returnops;}3. 调用方代码完全与硬件无关// main.c#includeled_interface.hintmain(void){LED_Ops ledLED_Create();// 创建对象内部已绑定具体硬件操作led.init();// 初始化硬件while(1){led.on();delay(500000);led.off();delay(500000);// led.toggle();}}三、更换硬件时如何修改假设要将 LED 换到GPIOC, Pin 13且改为高电平点亮只需修改led_stm32.c中的宏定义和hw_on/hw_off的实现逻辑#defineLED_PORTGPIOC#defineLED_PINGPIO_Pin_13#defineLED_PORT_CLKRCC_APB2Periph_GPIOC#defineLED_ON_LEVELBit_SET// 高电平点亮#defineLED_OFF_LEVELBit_RESETstaticvoidhw_on(void){GPIO_WriteBit(LED_PORT,LED_PIN,LED_ON_LEVEL);}staticvoidhw_off(void){GPIO_WriteBit(LED_PORT,LED_PIN,LED_OFF_LEVEL);}// hw_toggle 会自动适应因为内部读取当前电平再翻转main.c和led_interface.h完全不需要改动。如果换成其他平台如 Arduino、Linux GPIO只需重写hw_xxx函数工厂函数内部的绑定随之改变上层代码依然不变。四、进阶使用指针返回结构体避免拷贝如果结构体较大可以返回指针// 头文件LED_Ops*LED_Create(void);// 实现文件staticLED_Ops ops;// 静态实例LED_Ops*LED_Create(void){ops.inithw_init;ops.onhw_on;ops.offhw_off;ops.togglehw_toggle;returnops;}// 调用LED_Ops*ledLED_Create();led-init();led-on();五、总结技巧作用示例函数装进结构体定义统一接口模拟类的成员函数LED_Ops包含on、off等函数指针结构体装进函数工厂模式封装具体实现隐藏硬件差异LED_Create()返回绑定好具体hw_xxx的结构体这种封装方式在嵌入式、驱动开发、库设计中非常常见如 Linux 内核的file_operations、RT-Thread 的设备驱动框架。它实现了接口与实现分离更换底层硬件时只需修改一个源文件真正做到了“更换硬件时仅需修改一处代码”。

相关文章:

C 语言面向对象风格封装的经典技巧(STM32F1 标准库实现)

“把函数装进结构体,把结构体装进函数”是 C 语言中实现 面向对象风格封装 的经典技巧。它通过结构体容纳函数指针(模拟“方法”),再通过一个工厂函数返回该结构体的实例(模拟“对象”),从而将数…...

Kate文本编辑器

链接:https://pan.quark.cn/s/963a0fa99157Kate是一个可以跨平台使用的免费高级文本编辑器,支持标签页、代码高亮、显示行号、图的滚动条、多文件查找、横向或者纵向显示多个视图等众多高级特性。1、双击当前标签页创建新标签页。2、支持启用/禁用自动换…...

终极Python自动化购票解决方案:告别手动抢票的完整操作指南

终极Python自动化购票解决方案:告别手动抢票的完整操作指南 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为热门演出门票秒光而烦恼吗?DamaiHelper是一个基于Python…...

如何在Windows上免费创建10个虚拟显示器:终极解决方案指南

如何在Windows上免费创建10个虚拟显示器:终极解决方案指南 【免费下载链接】virtual-display-rs A Windows virtual display driver to add multiple virtual monitors to your PC! For Win10. Works with VR, obs, streaming software, etc 项目地址: https://gi…...

前端八股浏览器网络(1)---响应头

一、什么是响应头?响应头是 HTTP 响应中,服务器向浏览器传递的附加信息,用于描述响应数据类型、缓存策略、跨域权限、Cookie 设置等,不包含实际业务数据。HTTP 响应结构: ┌─────────────────────…...

AutoGLM-Phone-9B性能优化:让移动端推理速度提升30%的技巧

AutoGLM-Phone-9B性能优化:让移动端推理速度提升30%的技巧 1. AutoGLM-Phone-9B模型概述 AutoGLM-Phone-9B是一款专为移动设备优化的多模态大语言模型,在保持强大理解能力的同时,通过多项技术创新实现了高效的移动端推理。该模型基于GLM架构…...

基于Cosmos-Reason1-7B的网络安全威胁情报自动分析与报告生成

基于Cosmos-Reason1-7B的网络安全威胁情报自动分析与报告生成 每天一上班,安全运营中心(SOC)的分析师小李就要面对成百上千条安全告警、几十份漏洞报告和来自四面八方的威胁情报。他需要像侦探一样,从这些海量的、非结构化的文本…...

终极鼠标键盘自动化:开源免编程录制工具完全指南

终极鼠标键盘自动化:开源免编程录制工具完全指南 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 还在为每天重复…...

手把手教你用STM32F103C8T6打造百元级环境监测手表(含BME280传感器驱动避坑指南)

手把手教你用STM32F103C8T6打造百元级环境监测手表(含BME280传感器驱动避坑指南) 在创客圈里,用低成本硬件实现高价值功能一直是令人兴奋的挑战。本文将带你用STM32F103C8T6这颗性价比之王,配合BME280环境传感器,打造一…...

屡刷高分却不实用?南大团队揭示最强模型实际仅得49分

现有大模型评测分数日趋饱和,但与真实体验差距显著。南京大学傅朝友团队牵头,在 Google Gemini 评测团队邀约下推出视频理解新基准 Video-MME-v2。凭借创新的分层能力体系与组级非线性评分,以及 3300 人工时高质量标注,揭示模型与…...

亚洲美女-造相Z-Turbo部署案例:高校AI实验室私有化部署,支撑30+学生并发使用

亚洲美女-造相Z-Turbo部署案例:高校AI实验室私有化部署,支撑30学生并发使用 最近和一所高校AI实验室的老师聊天,他们遇到了一个挺有意思的难题。实验室有30多个学生,课程项目需要用到文生图模型来生成特定风格的图片,…...

MusePublic Art Studio效果实测:1024x1024输出在主流NVIDIA显卡表现

MusePublic Art Studio效果实测:1024x1024输出在主流NVIDIA显卡表现 1. 引言:当极简美学遇上高清渲染 想象一下,你有一个绝妙的创意画面在脑海中盘旋,但你不是程序员,也不想面对复杂的代码和命令行。你需要的&#x…...

湿度计算常数γ:气象学中的隐藏变量及其在农业灌溉中的实际应用

湿度计算常数γ:农业精准灌溉中的关键变量与实战应用 清晨五点,当第一缕阳光穿透薄雾洒在麦田上,土壤中的水分正以肉眼不可见的方式与空气进行着微妙交换。这种被称为"潜在蒸散"的过程,正是决定作物需水量的核心机制。而…...

国标GBT 28181实战解析:第三方呼叫控制在跨平台历史视音频回放中的关键实现(GB/T28181-2022)

1. 第三方呼叫控制机制在GB/T28181-2022中的核心价值 第一次接触国标GB/T28181的开发者,往往会被其复杂的协议栈和交互流程吓退。但当我真正在跨厂商视频监控项目中实施第三方呼叫控制时,才发现这套机制的精妙之处。想象一下这样的场景:某大型…...

【网络实战】跨越交换机的VLAN对话:Trunk链路配置全解析

1. 为什么需要Trunk链路? 想象一下你在一栋写字楼里办公,市场部在3楼,财务部在5楼。虽然两个部门在不同楼层,但同部门同事之间需要频繁传递文件。如果每层楼的交换机只能处理本层的网络流量,就像每层楼单独配备文件柜&…...

Ostrakon-VL-8B一文吃透:从模型架构、ShopBench构建到vLLM适配全链路

Ostrakon-VL-8B一文吃透:从模型架构、ShopBench构建到vLLM适配全链路 你是不是也遇到过这样的场景:想找一个能真正看懂零售店铺图片的AI助手,却发现市面上的通用模型要么识别不准,要么回答不专业?比如,你拍…...

暗黑3鼠标宏工具D3KeyHelper:告别手酸,解放双手的游戏助手

暗黑3鼠标宏工具D3KeyHelper:告别手酸,解放双手的游戏助手 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3…...

Qwen3-VL-4B Pro从零开始:基于Streamlit的现代化WebUI定制化部署

Qwen3-VL-4B Pro从零开始:基于Streamlit的现代化WebUI定制化部署 1. 项目概述 想不想让电脑不仅能看懂图片,还能跟你聊图片里的内容?Qwen3-VL-4B Pro就是这样一个神奇的工具。它基于阿里通义千问的最新视觉语言模型,能够理解图片…...

如何轻松获取八大网盘直链下载地址:终极免费下载助手指南

如何轻松获取八大网盘直链下载地址:终极免费下载助手指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

电感饱和电流测试基础—原理、意义与核心判定标准

在电源管理、DC-DC 变换器、滤波电路等电子系统中,电感是承担储能、滤波、升降压核心功能的关键被动元件。而 ** 饱和电流(Isat)** 作为电感最核心的极限参数之一,直接决定了电感在大电流工况下能否稳定工作。准确测试饱和电流&am…...

医学影像AI新突破:拆解MedSegDiff-V2如何用‘频域魔法’解决分割边界模糊难题

医学影像AI新突破:拆解MedSegDiff-V2如何用‘频域魔法’解决分割边界模糊难题 当医生面对一张模糊的脑部MRI影像时,肿瘤与正常组织的分界线往往如同雾里看花。这种边界模糊问题长期困扰着医学影像分析领域,尤其在器官移植规划、肿瘤体积测算等…...

Qwen3.5-2B模型实战:YOLOv11新特性解读与项目迁移指南

Qwen3.5-2B模型实战:YOLOv11新特性解读与项目迁移指南 1. YOLOv11技术亮点解析 目标检测领域最近迎来了一位重量级选手——YOLOv11。作为YOLO系列的最新成员,它在前代基础上做了不少有意思的改进。用Qwen3.5-2B模型分析后发现,这些变化主要…...

终极Windows快捷键冲突检测指南:Hotkey Detective完全使用教程

终极Windows快捷键冲突检测指南:Hotkey Detective完全使用教程 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...

PVE虚拟化部署OpenWRT旁路由:从镜像转换到网络配置全解析

1. 为什么选择PVEOpenWRT旁路由方案 最近两年软路由越来越火,很多朋友都在问要不要把家里的硬路由换成软路由。其实完全没必要这么折腾,用PVE虚拟化跑OpenWRT做旁路由才是更优雅的解决方案。我去年给公司办公室部署了这个方案,到现在稳定运行…...

FF14副本动画跳过插件:5分钟快速配置指南,告别冗长等待

FF14副本动画跳过插件:5分钟快速配置指南,告别冗长等待 【免费下载链接】FFXIV_ACT_CutsceneSkip 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_ACT_CutsceneSkip FF14副本动画跳过插件是专为《最终幻想14》国服玩家设计的智能工具&#…...

增强现实AR云的空间计算与持久化存储方案

增强现实AR云的空间计算与持久化存储方案 随着增强现实(AR)技术的快速发展,AR云作为支撑大规模、多用户协同体验的核心基础设施,正成为行业关注的焦点。AR云通过空间计算与持久化存储技术,将虚拟内容与物理世界无缝融…...

3分钟完成原神成就导出:YaeAchievement完整指南与快速入门

3分钟完成原神成就导出:YaeAchievement完整指南与快速入门 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement 还在为手动记录原神成就而烦恼吗?每次想要整理自己的成就…...

离线语音识别 Vosk 入门指南:开源、轻量、告别网络依赖

语音识别还是挺重要的,常用的比如现在语音输入法啊,需要将你说话的声音转成文字,再比如手机上各种智能助手,还有就是让龙虾可以听懂你发的语音(目前我是通过Whisper来实现的)但是这些大多数都需要依赖云端服…...

如何用KeymouseGo彻底告别重复工作:免费鼠标键盘录制工具终极指南

如何用KeymouseGo彻底告别重复工作:免费鼠标键盘录制工具终极指南 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo …...

无人驾驶定位基石:轮速计差速模型与航迹推算的工程实践

1. 无人驾驶中的定位挑战与轮速计的价值 想象一下你开车进入地下车库,手机导航突然显示"GPS信号弱"时的场景。无人驾驶车辆面临同样的问题,但后果可能严重得多——失去精准定位意味着失去对环境的理解能力。这正是轮速计差速模型与航迹推算技术…...