前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >offset宏定义_vba left函数

offset宏定义_vba left函数

作者头像
全栈程序员站长
发布2022-09-23 10:00:37
5220
发布2022-09-23 10:00:37
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

最近做某项目撸代码时用到了offsetof宏,第一次使用这个宏,项目结束后对其用法也略知一二,现分享如下。

位于stddef.h中的offsetof()宏,是获得struct中某成员相对于struct首地址的偏移量,以byte为单位,用struct首地址加该偏移量获得该成员的实际地址时,要把struct首地址强制转换成以byte为计数单位,地址本身一般都是32位(与芯片架构有关),强制转换的计数单位不会影响地址本身,该计数单位是告诉程序,对地址做运算时,偏移量是以该计数单位为单位的。比如,此处偏移量是以byte为单位的,故将struct首地址强制转换成以byte为计数单位,若将struct首地址强制转换成以2byte为计数单位,则该首地址与偏移量做运算时,将一个偏移量认为是2byte长度,这就导致计算出的成员实际地址有误,甚至超出分配给变量的地址的范围,导致Data Abort Exception,当然,这只是导致Data AbortException的一类原因。

*(u16 *)((u16 *)((u8 *)&ScrPara+s32)+c8)=i8;

用一个成员的实际地址去计算另一成员的实际地址时也要注意对第一个成员实际地址的计数单位的强制转换,此处是根据成员的size来决定的,若所有成员的size都是byte,则强制转换为byte,若size都是2byte,则强制转换为2byte,以此类推。若各种size都有,则强制转换为byte,避免引起混乱。

*(u16 *)((u16 *)((u8*)&ScrPara+s32)+c8)=i8;

以上各种地址,操作其内放的值时也要对地址进行一次计强制转换,该强制转换是与其内放的值的size相同。注意此处我没用“计数单位”这四个字,因为此处的强制转换不再是计数单位,而是其内放的值的size。若此时强制转换为byte,而值的size大于1个byte,则首先访问低位的byte。

*(u16 *)((u16 *)((u8*)&ScrPara+s32)+c8)=i16;

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172091.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档