随便看看吧 有分

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 打赏 收藏 转发到动态 举报
写回复
用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)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧