EN
/news/show.php/video/81594155.html

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

2025-06-24 11:36:21 来源: 新华社
字号:默认 超大 | 打印 |

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

技术涉及到更多的知识点和#xff0c;有些不常用,本着贴近现实的原则,让每个人都把学习时间花在重点上。

1.typedef的概念。

typedef 是 C 语言中的一个关键字,可以为基础。数据类型。、创建一个新的类型名称,如结构体、联合体和枚举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给unsigneded char、unsigned short 和 unsigned uint8___t、uint16_t、uint32_t别名。

使用typedef为数据类型创建别名的功能或优势是什么f;

①.提高代码可读性。

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

通过使用 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等库文件中,大量使用。

这种方法�在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,这样,代码可读性更高󿀌也简洁。

这种方法�￰在实际产品中c;也用了很多滴。

这种方法�实际产品,还使用了很多滴滴。

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) = EventHandle1;void (*KeyEvent_CallBack_t2)(unsigned char) = KeyeventHandle2;

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

让我们来看看typedef创建函数指针。

///使用typedef定义函数指针类型Keyevent_CallBack_ttypedef 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 这个函数指针类型,直接定义函数指针变量c;这比没有typedef的方式方便简洁多了,尤其是形参多的函数。

此方法�我自己做产品的时候用了很多,我们无际项目专项训练营的项目3和6都有很多这样的应用。

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

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

  • 用法基本不变,离不开它的宗,掌握这些,看到其他的基本可以融合。

  • 3.总结typedef的优势。


让我们总结一下,typedef的主要优点:

提高代码可读性:使用有意义的类型名,代码更容易理解。简化复杂类型󿄚对于复杂类型,如结构体、枚举、函数指针等c;使用 typedef 可简化变量定义。很容易修改:如果需要改变基本类型,只需更改 typedef 定义,所有使用这种类型的例子都不需要修改。

增加代码移植性:某些数据类型的大小可能因编译器或平台而异(而异;例如,在某些平台上,int可能是16个,在其他平台上,可能有32或64个)。通过使用 typedef,相同的名称可以在不同的平台上定义,以代表适当大小和对齐的数据类型。最近很多粉丝问我如何学习单片机#xff00c;根据自己十年的工作经验󿀌累积时间为一个月,仔细整理一份「单。片机最佳学习路径Ʊ单片机入门到高级教程#43;工具包」。全部免费分享给铁粉ñ!!除此之外,󿀌再含泪分享我压箱底的东西。22个热门开源项目。

,包含。源码+原理图+PCB+说明文档。,让你。

迅速进阶成为高手。

我可以看到教程资料包和详细的学习路径。

以下文章的开头。。从单片机入门到高级开挂的学习路径(附教程+工具)》。从单片机入门到高级开挂的学习路径(附教程+工具)》。单片机入门到高级开挂学习路径(附教程+工具)》。

【我要纠错】责任编辑:新华社