pjqblues
C++博客
首页
新随笔
联系
聚合
管理
公告
<
2024年8月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 9
文章 - 13
评论 - 3
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
c++(1)
(rss)
随笔档案
2007年10月 (2)
2007年1月 (1)
2006年12月 (1)
2006年11月 (2)
2006年9月 (1)
2006年8月 (2)
文章分类
c++
(rss)
crack
(rss)
文章档案
2007年6月 (1)
2006年12月 (1)
2006年9月 (6)
2006年8月 (5)
搜索
最新评论
1. re: offsetof 解析
评论内容较长,点击标题查看
--XXX
2. re: offsetof 解析
补充一下,size_t是unsigned int。
--read more books
3. re: 上海印象
哈哈,顶!
--周星星
阅读排行榜
1. offsetof 解析(4187)
2. 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterdivt_cast、和const_cast(3160)
3. com中以结构体作为接口参数(949)
4. Getting an (ATL) ActiveX control to print from Office Applications(505)
5. 转===如何用ATL创建ActiveX控件(牛人翻译的)(499)
评论排行榜
1. offsetof 解析(2)
2. 上海印象(1)
3. 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterdivt_cast、和const_cast(0)
4. 2006年世界顶级杀毒软件排名(0)
5. com中以结构体作为接口参数(0)
offsetof 解析
1
offsetof(s,m)解析 offsetof(s,m)解析
2
3
今天看代码时,发现一个有用的东东,offsetof(s,m),这是一个宏,定义如下:
4
5
#define
offsetof(s,m) (size_t)&(((s *)0)->m)
6
7
然后到网上查了一下,发现还真的是很有用,附带一位大侠的解说:
8
9
struct
AAA
10
{
11
int
i;
12
int
j;
13
}
;
14
15
struct
AAA
*
pAAA;
16
pAAA
=
new
AAA;
17
这时,pAAA实际上是一个Pointer, 指向某一确定的内存地址,比如0x1234;
18
而 pAAA
->
i 整体是一个int型变量,其地址是
&
(pAAA
->
i) ,
'
&
'
为取址运算符;
19
那么
&
(pAAA
->
i)一定等于0x1234,因为i是结构体AAA的第一个元素。
20
而
&
(pAAA
->
j)一定是0x1234
+
0x4
=
0x1238
; 因为sizeof(
int
)
=
4
;
21
22
这个做法的巧妙之处就是:它把“
0
”作为上例中的pAAA,那么
&
(pAAA
->
j)就是j的
23
offset啦
24
25
解析结果是:
26
(s
*
)
0
,将
0
强制转换为Pointer to
"
s
"
27
可以记 pS
=
(s
*
)
0
,pS是指向s的指针,它的值是0;
28
那么pS
->
m就是m这个元素了,而
&
(pS
->
m)就是m的地址,而在本例中就是offset啦
29
30
再把结果强制转换为size_t型的就OK 了,size_t其实也就是int啦!!
31
32
33
posted on 2007-10-22 16:02
blues
阅读(4187)
评论(2)
编辑
收藏
引用
所属分类:
c++
评论
#
re: offsetof 解析 2007-10-22 17:12
read more books
补充一下,size_t是unsigned int。
回复
更多评论
#
re: offsetof 解析
2007-10-24 22:30
XXX
size_t并不一定是unsigned int,应该是依赖系统而typedef的,比如64位可能是uint64_t之类的
这个宏在一些老式C或C++系统里用的比较多,比如Symbian里的用来构造数组搜索用的Key的宏_FOFF就如下定义:
#define _FOFF (c, f) (((TInt)&(((c *)0x1000)->f))-0x1000)
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理