雨滴科技技术论坛

 找回密码
 立即注册
查看: 3425|回复: 5

msOS中关于SystemStruct System =(Init, );的理解

[复制链接]

91

主题

455

帖子

2111

积分

金牌会员

Rank: 6Rank: 6

积分
2111
扫一扫,手机访问本帖
发表于 2017-7-16 19:23:21 | 显示全部楼层 |阅读模式


         在学习msOS时,遇到了问题,用法比较新颖,没有见过,所以比较疑惑,在msOS里面有下面这段代码。
  1. SystemStruct System =
  2. {
  3.     Init,   // 直接初始化Init成员,不需要赋值
  4. };
复制代码

         这里的Init是一个函数的名字,而这里用了这种赋值的方法,我试验过,如果没有这个语句,程序是会出错的,当时我不明白为什么需要这样做,经过多次的请教后和自己的理解后才知道这样有什么作用。
         这种赋值的方法,跟数组赋值的方法类似,为什么需要这样做?
第一点:要给System一个实体,不这样做,就没法用System.Init
第二点:SystemStruct结构体里面封装了所有函数的接口,而这个结构体里面的第一个接口void (*Init)(void);是没有赋值的,那么这里的意思就是给这个接口赋值,那么这时候大家就有疑问了,其它的接口不需要赋值吗?答案是,要,但是不是在这里,在设备层里都可看到类似这样的赋值
  1. System.Device.Key.Enable = EnableKey;
复制代码

         所以其它的接口将会在设备初始化的时候赋好值。
         那么再做一次总结,这里的作用就是把System变为一个实体,就像你要用一个变量a一样,你首先就得对这个变量定义一个类型一样,然后就是对结构体void (*Init)(void);接口赋值,其它的值不赋值,则是空,因为后面这些值将会再初始化中进行相应的赋值。


回复

使用道具 举报

404

主题

2039

帖子

1万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
11237
发表于 2017-7-17 00:03:40 | 显示全部楼层
msOS中,有很多很好的用法,值得你深入学习。
回复 支持 反对

使用道具 举报

282

主题

1583

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17183
发表于 2017-7-17 00:07:51 | 显示全部楼层
System 就是一个 SystemStruct 结构体(类型)的变量。
是变量就需要初始化,这个语句就是变量初始化。
初始化的对象是结构体内的函数指针变量,初始化的值就是函数的地址。由于函数名就是函数地址,所以这里直接用了函数名。
其他的函数指针在这里都被赋值为0。
回复 支持 反对

使用道具 举报

91

主题

455

帖子

2111

积分

金牌会员

Rank: 6Rank: 6

积分
2111
 楼主| 发表于 2017-7-17 12:44:28 | 显示全部楼层
tomsu 发表于 2017-7-17 00:07
System 就是一个 SystemStruct 结构体(类型)的变量。
是变量就需要初始化,这个语句就是变量初始化。
初 ...

更加清晰了
回复 支持 反对

使用道具 举报

107

主题

996

帖子

3274

积分

论坛元老

Rank: 8Rank: 8

积分
3274
发表于 2018-1-21 19:45:23 来自手机 | 显示全部楼层
赞一个!!!
回复

使用道具 举报

0

主题

10

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2020-11-20 22:52:05 | 显示全部楼层
tomsu 发表于 2017-7-17 00:07
System 就是一个 SystemStruct 结构体(类型)的变量。
是变量就需要初始化,这个语句就是变量初始化。
初 ...

谢谢。了解了~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
在线咨询
咨询热线
0755-26787502-8006/8016
扫一扫二维码
直接访问本站

QQ|Archiver|手机版|小黑屋|雨滴科技  

GMT+8, 2023-3-28 14:26 , Processed in 0.063791 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表