完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。
下面使用typedef定义一个数据类型 int main() { typedef unsigned char BYTE; BYTE c = 10; printf("%d rn",c); system("pause"); return 0; } 使用typedef将unsigned char类型重新定义为BYTE类型,然后在使用新的类型BYTE定义一个变量c。输出结果如下: 此时如果使用 #define 来替换,好像也可以。 这里使用 #define 将unsigned char替换为 BYTE好像也正确。 下面在看一个例子。 int main() { typedef char * STR; STR s1,s2; s1="abc"; s2="123"; printf("%s %s rn",s1,s2); system("pause"); return 0; } 将字符指针 char * 重新定义为STR类型,然后使用STR定义两个指针s1和s2,这样s1和s2都是指向字符的指针。接着给这两个指针赋值,然后打印出来。 这时使用 #define 来替换 typedef 的功能。 #define STR char * int main() { STR s1,s2; s1="abc"; s2="123"; printf("%s %s rn",s1,s2); system("pause"); return 0; } 这时候编译程序的时候,程序会报错。 这时为什么呢?因为使用typedef的时候,是定义了一个新的数据类型。 typedef char * STR; STR s1,s2; 相当于 char *s1, *s2; s1="abc"; s2="123"; s1和s2都是指向字符类型的指针。 如果使用 #define 的时候,系统只是简单的替换。 #define STR char * STR s1,s2; 将STR用 char * 进行替换 char *s1,s2; s1="abc"; s2="123"; 替换后只有s1是指针,s2依然是一个char类型的变量。所以给s2赋值一个字符串的时候系统就会报错。因此要重新定义一个数据类型的时候,要使用typedef,这个在定义结构体的时候使用的非常多。 typedef struct Date { int year; int month; int day; } DT; 使用typedef 将结构体 struct Date 重新定义为DT类型,这样在使用DT定义变量的时候,就相当于使用了 struct Date 来定义变量。 typedef struct Date { int year; int month; int day; } DT; DT d1 = {2021,10,1}; DT d2 = {2021,10,10}; 等价于 struct Date { int year; int month; int day; }; struct Date d1 = {2021,10,1}; struct Date d2 = {2021,10,10}; 这样通过使用 typedef 来重新定义一个新的类型,使代码写起来更加的简洁。这种方法在单片机的库函数中使用的最多。 typedef struct { uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef; void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED0-->PA8 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); /PD2 输出高 } 通过 typedef 将结构体重定义为GPIO_InitTypeDef 类型,这样在初始化的时候,直接使用GPIO_InitTypeDef 类型就可以定义一个关于GPIO的结构体。 在定义数据类型的时候,也会用到 typedef 重新定义一个数据类型。 通过tepedef 定义新的数据类型,增加了代码的可读性和移植性。这里说的新的数据类型不是创建了一个系统不存在的数据类型,而是给已经存在的某个类型增加了一个方便使用的标签。而这个标签又不同于 #define 只是简单的符号替换。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3457 浏览 1 评论
8996 浏览 16 评论
4050 浏览 18 评论
1107浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1858浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 09:17 , Processed in 1.242132 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号