单片机软件架构连载(3)-typedef

今天给大家讲typedef,这个关键字在实际产品开发中,也是海量应用。

技术涉及知识点比较多,有些并不常用,我们以贴近实际为原则,让大家把学习时间都花在重点上。

1.typedef的概念

typedef 是 C 语言中的一个关键字,可以为基本数据类型、结构体、联合体、枚举等创建一个新的类型名,有助工程师编写更清晰、更易于维护的代码。

2.typedef的几种用法

2.1用于基本数据类型

// 使用typedef关键字定义一个新类型名uint8_t,它代表无符号的8位字符(即0到255的整数)
typedef unsigned char uint8_t;// 使用typedef关键字定义一个新类型名uint16_t,它代表无符号的16位短整型(即0到65535的整数)
typedef unsigned short uint16_t;// 使用typedef关键字定义一个新类型名uint32_t,它代表无符号的32位整型(即0到4294967295的整数)
typedef unsigned int uint32_t;// 声明一个类型为uint8_t的变量a,可以存储8位无符号整数
uint8_t a;// 声明一个类型为uint16_t的变量b,可以存储16位无符号整数
uint16_t b;// 声明一个类型为uint32_t的变量c,可以存储32位无符号整数
uint32_t c;

这段代码用typedef给unsigned char、unsigned short 和 unsigned int分别创建了uint8_t、uint16_t、uint32_t别名。

这里使用typedef给数据类型创建别名有什么作用或优势?

①.提高代码可读性

通过使用 uint8_t、uint16_t 和 uint32_t 这样的类型名,比直接使用基本数据类型 unsigned char、unsigned short 和 unsigned int 更易于理解。

②跨平台兼容性

不同的编译器或平台可能对基本数据类型的大小有不同的定义(例如,某些编译器可能将 int 定义为 16 位或 64 位),如果将来换了编译器或平台,只需更改 typedef 的定义,而不必在代码库中搜索和替换每个变量定义,代码维护更加容易。

③定义变量时更加方便

不用每次都写 unsigned char、unsigned short 和 unsigned int。

2.2用于结构体

我们可以通过以下方式创建结构体。

struct USART_InitTypeDef
{uint32_t USART_BaudRate;        uint16_t USART_WordLength;        uint16_t USART_StopBits;     uint16_t USART_Parity;         uint16_t USART_Mode;           uint16_t USART_HardwareFlowControl;  
};//定义结构体变量
struct USART_InitTypeDef stu_usart;

不过这种方式,每次定义结构体变量都要加struct .....,比较麻烦。

所以,我们可以用typedef关键字给结构体创建一个别名。

typedef struct
{uint32_t USART_BaudRate;        uint16_t USART_WordLength;        uint16_t USART_StopBits;     uint16_t USART_Parity;         uint16_t USART_Mode;           uint16_t USART_HardwareFlowControl;  
} USART_InitTypeDef;//定义结构体变量
USART_InitTypeDef stu_usart;

使用typedef给结构体创建了别名USART_InitTypeDef,下次就可以直接使用USART_InitTypeDef去定义结构体变量,不用再写struct了,这样代码更加方便简洁。

这种方式,在STM32之类的库文件里,有海量的使用。

2.3用于枚举

typedef enum
{ GPIO_Mode_AIN = 0x0,GPIO_Mode_IN_FLOATING = 0x04,GPIO_Mode_IPD = 0x28,GPIO_Mode_IPU = 0x48,GPIO_Mode_Out_OD = 0x14,GPIO_Mode_Out_PP = 0x10,GPIO_Mode_AF_OD = 0x1C,GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;//定义枚举变量
GPIOMode_TypeDef GPIO_Mode;

这段代码定义了一个枚举类型,使用 typedef 关键字,这个枚举类型被赋予了一个别名GPIOMode_TypeDef,下次需要定义该枚举类型变量时,可直接使用GPIOMode_TypeDef xx,这样代码可读性更高,也简洁。

这种方式,在实际产品中,也是用的非常多嘀。

2.4用于函数指针

我们先来看看不用typedef的函数指针创建方法:

//代码示例1,不用typedef的函数指针// 定义一个函数,形参为无符号字符类型,无返回值。
void KeyEventHandle1(unsigned char keys)
{//功能实现
}void KeyEventHandle2(unsigned char keys)
{//功能实现
}//定义了一个函数指针 KeyEvent_CallBack_t,并将KeyEventHandle函数的地址赋给它。
void (*KeyEvent_CallBack_t1)(unsigned char) = KeyEventHandle1;
void (*KeyEvent_CallBack_t2)(unsigned char) = KeyEventHandle2;

这种方式,如果需要重复去定义同样的函数指针,是比较麻烦的,每次定义函数指针变量都要写void (*函数指针变量名)(形参1)......

下面来看看用typedef创建函数指针。

//使用了typedef定义函数指针类型KeyEvent_CallBack_t
typedef void (*KeyEvent_CallBack_t)(unsigned char keys);void KeyEventHandle1(unsigned char keys)
{//功能实现
}void KeyEventHandle2(unsigned char keys)
{//功能实现
}KeyEvent_CallBack_t KeyScanCBS1 = KeyEventHandle1;
KeyEvent_CallBack_t KeyScanCBS2 = KeyEventHandle2;

很明显,我们可以用KeyEvent_CallBack_t 这个函数指针类型,直接定义函数指针变量,这样比不用typedef的方式要方便简洁很多,特别是对于那些形参多的函数。

这种方式,我自己做产品时用的很多,我们无际项目特训营的项目3和6都有挺多这种应用。

以上,是我做产品接触最多的几种用法,还有其它的,比如typedef+数组,typedef+联合体,我个人用的比较少。

用法基本万变不离其宗,掌握这几种,看到其它的也基本能融会贯通。

3.typedef的优势总结

我们来总结下,typedef最主要的几点优势:

  • 提高代码可读性:通过使用有意义的类型名,代码更易于理解。

  • 简化复杂类型:对于结构体、枚举、函数指针等复杂类型,使用 typedef 可以简化变量定义。

  • 易于修改:如果基本类型需要更改,只需更改 typedef 定义,而不必修改使用该类型的所有实例。

  • 增加代码移植性:不同编译器或平台可能对某些数据类型的大小有差别(例如,int在某些平台上可能是16位,在另一些平台上可能是32位或64位)。通过使用 typedef,可以在不同的平台上定义相同的名字来代表具有适当大小和对齐的数据类型。


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DP:背包问题----0/1背包问题

文章目录 💗背包问题💛背包问题的变体🧡0/1 背包问题的数学定义💚解决背包问题的方法💙例子 💗解决背包问题的一般步骤?💗例题💗总结 ❤️❤️❤️❤️❤️博客主页&…

【RflySim学习笔记】1.RflySim的绪论

目录 文章目录 目录1.RflySim 平台背景2.RflySim 平台特点3.RflySim 平台核心组件介绍3.1 CopterSim3.2 RflySim3D/RflySimUE5UE引擎:RflySim3D/RflySimUE5 3.3 QGroundControl地面站3.4 Python38Env3.5 MATLAB自动代码生成工具箱3.6 SITL/HITL批处理脚本3.7 PX4 Fi…

springboot+vue+mybatis前台点菜系统+PPT+论文+讲解+售后

21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到…

Golang | Leetcode Golang题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; func shortestPalindrome(s string) string {n : len(s)fail : make([]int, n)for i : 0; i < n; i {fail[i] -1}for i : 1; i < n; i {j : fail[i - 1]for j ! -1 && s[j 1] ! s[i] {j fail[j]}if s[j 1] s[i] {fail[i…

SDIO学习(2)--SD 2.0协议

目录 1. SD卡简介 1.1 SD卡概念 1.2 SD卡外形和接口 2. SD 2.0主要特性 3. SD 卡系统概念 3.1 读写属性 3.2 总线拓扑结构 3.2.1 SD模式 3.2.2 SPI模式 3.3 SD 2.0总线协议 3.3.1 命令&#xff08;Command&#xff09; 3.3.1.1 命令分类 3.3.1.2 命令格式 3.3.1.…

精确计算应用的冷启动耗时

在iOS项目中&#xff0c;冷启动时间是指从用户点击应用图标开始&#xff0c;到应用完全加载并呈现出第一个界面&#xff08;可能需要网络请求必要的数据&#xff09;所花费的时间。这里以 main 函数为界&#xff0c;分为两个时间段&#xff1a; 从用户点击应用图标 ~ invoke m…

(4)深入探索与优雅安装:Pandas数据处理的魅力之旅

目录 1. 前言1.1 Pandas 概述1.2 Pandas 特点1.3 优化应用举例1.4 Pandas 应用场景 2. DataFrame2.1 DataFrame结构2.2 Pandas 安装2.2.1 Pandas 安装准备2.2.2 Pandas 安装2.2.3 Pandas 包的导入2.2.4 查看 pandas 版本2.2.5 一个简单的 1. 前言 1.1 Pandas 概述 pandas 是 …

大数据招商的应用场景及实施路径有哪些?

当下&#xff0c;我国已经进入数字经济与实体经济融合发展的新阶段&#xff0c;数字技术和数字化转型落地日臻成熟&#xff0c;数据要素价值释放深入到了我国各个领域的发展&#xff0c;招商引资也不例外&#xff0c;在传统招商模式效果日渐甚微的大环境下&#xff0c;大数据招…

Java 基础知识之 switch 语句和 yield 关键字

传统 switch 语句 传统的 switch 语句我们已经写了一万遍了&#xff0c;以下是一个典型的 switch 语句&#xff1a; int dayOfWeek 3; switch (dayOfWeek) {case 1:System.out.println("星期一");break;case 2:System.out.println("星期二");break;case…

NAT地址转换实验,实验超简单

实验拓扑 实验目的 将内网区域&#xff08;灰色区域&#xff09;的地址转换为172.16.1.0 实验过程 配置静态NAT&#xff08;基于接口的静态NAT&#xff09; R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…

游戏AI的创造思路-技术基础-自然语言处理

自然语言处理-可以对游戏AI特别是RPG类、语言类游戏进行“附魔”&#xff0c;开发出“随机应变”和你聊天的“女友”、“队友”或者是根据你定义的文本库来用接近自然语言的生成“语言”&#xff0c;推动游戏情景在受控范围内前进 目录 1. 自然语言处理定义 2. 发展历史 3. …

泛微开发修炼之旅--26前端j实现手机号码验证

文章链接&#xff1a;26前端j实现手机号码验证

AiPPT的成功之路:PMF付费率与增长策略

如果要给 2023 年的 AI 市场一个关键词&#xff0c;那肯定是“大模型”&#xff0c;聚光灯和大家的注意力、资金都投向了那些大模型公司&#xff1b;而如果要给 2024 年的 AI 市场一个关键词&#xff0c;则一定是 PMF&#xff08;产品市场契合&#xff09;。如果没有 PMF&#…

五粮液:稳,还稳得住吗?

前有“酱香”茅台一骑绝尘&#xff0c;后有“清香”汾酒21%的增速虎视眈眈。 在新的股东大会上&#xff0c;管理层把“稳”字说了近30次。 就问白酒二哥——五粮液&#xff0c;你还稳得住吗&#xff1f; 近期&#xff0c;白酒大哥茅台因跌价吸引各方关注&#xff0c;但在这一…

人脸重建迁移攻击FRTA:绕过各种未见过的面部识别系统

随着人脸识别系统在安全关键环境中的部署日益增多&#xff0c;威胁行为者正在开发针对各种攻击点的复杂攻击策略。在这些攻击策略中&#xff0c;面部重建攻击是一个主要的威胁。面部重建攻击的主要目的是创建伪造的生物特征图像&#xff0c;这些图像类似于存储的生物特征模板中…

头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)...

文章目录 延迟任务精准发布文章 1)文章定时发布2)延迟任务概述 2.1)什么是延迟任务2.2)技术对比 2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现 3)redis实现延迟任务4)延迟任务服务实现 4.1)搭建heima-leadnews-schedule模块4.2)数据库准备4.3)安装redis4.4)项目…

【系统架构设计师】计算机组成与体系结构 ⑨ ( 磁盘管理 | “ 磁盘 “ 单缓冲区 与 双缓冲区 | “ 磁盘 “ 单缓冲区 与 双缓冲区案例 )

文章目录 一、" 磁盘 " 单缓冲区 与 双缓冲区1、" 磁盘 " 单缓冲区2、" 磁盘 " 双缓冲区 二、" 磁盘 " 单缓冲区 与 双缓冲区案例1、案例描述2、磁盘单缓冲区 - 流水线分析3、磁盘双缓冲区 - 流水线分析 一、" 磁盘 " 单缓冲…

2024年电子信息工程与电气国际学术会议 (EIEEE 2024)

2024年电子信息工程与电气国际学术会议 &#xff08;EIEEE 2024&#xff09; 2024 International Academic Conference on Electronic Information Engineering and Electrical Engineering 【重要信息】 大会地点&#xff1a;北京 大会官网&#xff1a;http://www.iceieee.co…

Unity休闲手机游戏开发课程

课程介绍 Unity休闲手机游戏开发课程将教您如何利用Unity游戏引擎创建令人愉快的休闲手机游戏。从基础的游戏开发知识到高级的游戏制作技巧&#xff0c;您将学习到创建各种类型的休闲游戏所需的关键技能和工具。无论您是初学者还是有一定经验的开发者&#xff0c;本课程都能帮助…

【Linux】TCP协议【下三】{面向字节流/粘包问题/TCP异常情况/文件和Socket}

文章目录 7.面向字节流TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09; 8.粘包问题9.TCP异常情况10.再谈文件和socket的关系 7.面向字节流 创建一个TCP的socket, 同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区;一个链接一对发收缓…