打印
[应用相关]

【原创】C语言中关于关于typedef与struct组合的两种用法

[复制链接]
1289|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


发展到现在,C语言作为一种可以操作底层的高级语言,
几乎可以说是覆盖到了每一款单片机。
最近用STM32开发项目的时候偶然注意到了一个小问题,
也是STM32函数库里边常用的一种变量定义方式。
由此引申出了这篇文站,现在分享给大家。

大家先看下面的两个关于结构体定义的写法。
方法一:


方法二:

沙发
通宵敲代码|  楼主 | 2017-2-11 13:27 | 只看该作者
本帖最后由 通宵敲代码 于 2017-2-11 13:38 编辑


其中方法一是我们定义一个结构体实体最常用的方法二方法二这是STM32库函数中给出的一个常用的方法


我们知道,我们定义的结构体变量类似于一个数据类型,
可以直接用来定义相同结构的结构体变量,如下图



其中struct是为了说明我们定义的是结构体变量,类似于整形int;
MesgData使我们用来定义变量的原型,类似于整形变量的长度WORD;
而最后的UserMesgData才是我们真正要用的结构体变量。
如果要跨文件调用这个变量,我们还需要使用extern声明一下。


以上便是我们在C语言中学到的关于结构体的最基本用法。

但是,开发过STM32程序的技术人员都知道,
在STM32中我们要初始化一组寄存器,
来定义这组寄存器的结构体变量时,我们都是这么写的



其中,根本没有使用struct前缀,
好像MesgData直接跟int一样,起了相同的作用,
似乎成了C编译器默认的关键词了,
而编译器也没有报告任何错误,程序也能正常执行。


使用特权

评论回复
板凳
通宵敲代码|  楼主 | 2017-2-11 13:27 | 只看该作者
本帖最后由 通宵敲代码 于 2017-2-13 12:22 编辑

其实这个问题的关键就在于方法二定义结构体时使用了typedef,我们都知道,typedef的最近本也是最常用的功能,
就是给变量或函数重新定义一个别名,

比如STM32开发中我们使用的u8,u16,u32
其原型是这么定义的
typedef char u8;
typedef int u16;
typedef long u32;
所以当我们使用u8、u16、u32是,
效果跟char、int、long是一样的,
u8、u16、u32不是是他们的别名,

此处的MesgHead也是一样,他不过是结构体原型的别名,

所以我们可以直接用的来定义结构体变量UserMesgData。

使用特权

评论回复
地板
mintspring| | 2017-2-11 16:51 | 只看该作者
可以把结构体作为一个新的类型使用。

使用特权

评论回复
5
通宵敲代码|  楼主 | 2017-2-13 08:05 | 只看该作者
mintspring 发表于 2017-2-11 16:51
可以把结构体作为一个新的类型使用。

恩,此处的区别在于,
结构体是做为新类新,去定义变量,
还是对结构体重命名用来进行引用。

使用特权

评论回复
6
feelhyq| | 2017-2-13 09:31 | 只看该作者
通宵敲代码 发表于 2017-2-11 13:27
其实这个问题的关键就在于方法二定义结构体时使用了typedef,我们都知道,typedef的最近本也是最常用的功能 ...

伙计,我怎么感觉这里怪怪的,我在学校的时候老师是这么教我定义的

typedef char u8;
typedef int  u16;
typedef long u32;

使用特权

评论回复
7
通宵敲代码|  楼主 | 2017-2-13 12:22 | 只看该作者
feelhyq 发表于 2017-2-13 09:31
伙计,我怎么感觉这里怪怪的,我在学校的时候老师是这么教我定义的

typedef char u8;

脑子抽抽,写反了
多谢提醒,已修改

使用特权

评论回复
8
feelhyq| | 2017-2-13 13:13 | 只看该作者
通宵敲代码 发表于 2017-2-13 12:22
脑子抽抽,写反了
多谢提醒,已修改

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:年轻不是资本,奋斗才是良策!

302

主题

7539

帖子

69

粉丝