社区
C语言
帖子详情
随便看看吧 有分
rain1976
2004-10-15 11:15:35
typedef struct QueueMemberSTR {
struct QueueMemberSTR * next;
WORD8 buf[60];
} QueueMemberType;
#define QHSIZE (WORD32) (&((QueueMemberType *)0)->buf)
解释一下这个define 的意思
...全文
168
23
打赏
收藏
随便看看吧 有分
typedef struct QueueMemberSTR { struct QueueMemberSTR * next; WORD8 buf[60]; } QueueMemberType; #define QHSIZE (WORD32) (&((QueueMemberType *)0)->buf) 解释一下这个define 的意思
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
rain1976
2004-10-15
打赏
举报
回复
QHISIZE的值是多少
yangsongx
2004-10-15
打赏
举报
回复
获得QueueMemberSTR中成员变量的偏移量。
这在Linux的include/linux/list.h下也有类似的定义方法。
如LIST_ENTRY()宏
wolsen
2004-10-15
打赏
举报
回复
我只知道是宏定义,具体定义了什么我就看不大懂了,因为我也是初学者
zhusunme
2004-10-15
打赏
举报
回复
宏定义啊
hjf1223
2004-10-15
打赏
举报
回复
宏吧?
zgy166
2004-10-15
打赏
举报
回复
(WORD32)(&((QueueMemberType *)0)->buf)
让我们来一步一步的分析他:
((QueueMemberType *)0) 目的是把0地址强制转换成QueueMemberType结构;这个时候就意味者在0地址已经有了个结构体QueueMemberType,然后取结构体的成员buf的地址,结构体的地址+struct QueueMemberSTR * next的地址(4),就是该宏的结果了:4
zgy166
2004-10-15
打赏
举报
回复
标准答案:
QHSIZE = 4(windows)
取得buf成员在结构体的存储结构里面的相对偏移,这是常用的用法。
keple
2004-10-15
打赏
举报
回复
出现 QHSIZE 就将它替换成 (WORD32)(&((QueueMemberType *)0)->buf)
lynnboy
2004-10-15
打赏
举报
回复
(WORD32)(&((QueueMemberType *)0)->buf)
楼上的基本都不对!!!!!!!!!
0
数值,这里被当作0地址
(QueueMemberType *)0
这句说明吧地址0解释成一个QueueMemberType的地址,
作用就是假设在地址0的地方存在一个QueueMemberType.
((QueueMemberType *)0)->buf
位于地址0的QueueMemberType的buf成员,是个WORD8数组首地址
&((QueueMemberType *)0)->buf
位于地址0的QueueMemberType的buf成员的地址
(WORD32)(&((QueueMemberType *)0)->buf)
最后再把类型信息去掉,取得该地址的实际数值。
由于是地址0的QueueMemberType成员buf的地址,
所以再数值上就是buf在每个QueueMemberType的偏移量,yangsongx说对了
#define QHSIZE (WORD32) (&((QueueMemberType *)0)->buf)
名字 QHSIZE 表示“Queue Header Size”。
这个宏的作用就是取得某个结构中某成员的偏移地址或某成员前的头部信息实际大小。
使用这种方式是为了防止由于编译器、平台造成的结构体内成员分布情况不兼容
因为许多时候,仅仅用sizeof运算符不能保证结果的正确性。
比如指针位数的差异、内存对齐的影响等等。
不过,大多数时候用sizeof还是够用了。
比如这个例子相当于
#define QHSIZE (WORD32)sizeof(QueueMemberType *)
fallhunter
2004-10-15
打赏
举报
回复
估计是你写错了吧
(QueueMemberType *)0是把0转换成(QueueMemberType *)类型
那么这个宏就没又参数,我估计是:
#define QHSIZE(x) (WORD32) (&((QueueMemberType *)x)->buf)
这样就是 x所指的buf的地址
rain1976
2004-10-15
打赏
举报
回复
谁都知道是宏定义 但是他的值是多少
GGL123
2004-10-15
打赏
举报
回复
up
wanglianhui
2004-10-15
打赏
举报
回复
是宏定义呀! (&((QueueMemberType *)0)->buf)
就是指把(&((QueueMemberType *)0)->buf)赋给了QHSIZE (WORD32)
知道吗?
kenyle
2004-10-15
打赏
举报
回复
同意sdp(雨尘)说法.
typedef struct QueueMemberSTR {
struct QueueMemberSTR * next;
WORD8 buf[60];
} QueueMemberType;
(WORD32)(&((QueueMemberType *)0)->buf)
WORD32 是自定义的吧,这里作了强转换了.
按运算符来分一下是(&((QueueMemBerType *)0)->buf)
中的(QueueMemBerType *)也是一个强制转换.可以看一下钱能的书上有说到.
((QueueMemBerType *)0)第一个数组,然后指身它的buf,接下来取地址.
dudu妈
2004-10-15
打赏
举报
回复
宏定义,我也是初学者,就知道这么一点
挺拔的劲松
2004-10-15
打赏
举报
回复
#define QHSIZE (WORD32) (&((QueueMemberType *)0)->buf)
这是宏定义,
出现 QHSIZE 就将它替换成 (WORD32)(&((QueueMemberType *)0)->buf)
(WORD32) 应该是个强值类型转换。
Win32Boy
2004-10-15
打赏
举报
回复
#define QHSIZE (WORD32) (&((QueueMemberType *)0)->buf)
//define:vt.1. 解释,给...下定义
2. 规定,限定,使明确
3. 确定...的界线;使...的轮廓分明
4.为...的特性,是...的特色[(+as)];
//个人看法:为(WORD32) (&((QueueMemberType *)0)->buf)的变量取一别名:QHSIZE。
realmz
2004-10-15
打赏
举报
回复
我也想知道
yeehya
2004-10-15
打赏
举报
回复
不明白,(QueueMemberType *)0 == what????
Cyberlark
2004-10-15
打赏
举报
回复
也只知道宏定义!……
加载更多回复(3)
面试经验+基础总结
(阿里、百度、蘑菇街的面试总结)+平时的面试资料整理+我的简历,是自己平时的总结,带有主观性呢,大家可以
随便
看看
。
找不到资源?这五个网站小说、影视
随便
看
1、
看看
屋 在线观看影视资源网站,你还在百度上面找电影观看吗?其实网上有许多免费的在线视频网站,就比如这个网站,里面有相对来讲比较全面的资源视频,如:电视剧、影视、动漫等等一应俱全 2、91听歌网 91听歌网...
springboot+Vue+mycat整合前后端分离分库分表读写分离权限后台管理系统
本课程实现一个基于SpringBoot+Jpa+JWT+Spring Security+Vue+ElementUI+mycat整合前后端分离分库分表读写分离权限后台管理系统,数据库采用的是:mysql5.7,本项目主要功能模块有:用户管理、角色管理、菜单管理、...
buuctf [强网杯 2019]
随便
注 1
显示所有数据,这个数据有什么用我也不知道,但sql注入一般第一步就是这样
看看
有没有有用的信息(没有)。 输入 1' order by 2;# 1' order by 3;# 到第3列报错,说明只显示两列。 输入1'; show tables;# 可以...
随便
发一篇,
看看
有多少人想看
有人看我就继续发下去,有什么想说的看评论区。
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章