Chinaunix首页 | 论坛 | 博客
  • 博客访问: 642469
  • 博文数量: 78
  • 博客积分: 4990
  • 博客等级: 上校
  • 技术积分: 1386
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-13 19:25
文章分类

全部博文(78)

文章存档

2010年(6)

2009年(25)

2008年(47)

我的朋友

分类: C/C++

2010-02-04 10:45:21

我先给出我写的一个简单的sample再做进一步的说明:
#include
#include

struct A
{
int a;
};

struct B
{
struct A  aaa;
int b;
};

#define CONTAINING_RECORD(address, type, field) ((type *)( \
(char *)(address) - \
(unsigned long)(&((type *)0)->field)))

int main(void) {
puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
struct B *pb;
struct A aa;
aa.a = 1;
CONTAINING_RECORD(pb, struct B, aaa) = (struct B *)&aa;

printf("%d\n", pb->aaa.a);

return EXIT_SUCCESS;
}

程序的执行结果为 “1”,在windows上用的eclipse进行编辑,编译器用的Cygwin。
其实代码都很简单,我想主要讲解一下CONTAINING_RECORD 这个宏函数。这个函数是实现继承的重要的一步。

&((type *)0)->field))其实就是field到address 0的偏移量,再用address减去这个偏移量就得到了filed实际所在的位置。可能大家会对address为什么要转换为(char×)好奇。我先举一个例子:int ×a; a-1 移动了四个位置,那如果a是char×的话每一次移动的就是1个位置。这也就是上面要强制转换为char×的原因所在。

阅读(1433) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

fera2010-02-09 10:06:12

建议你去看看Linux的FS,这部分是用C实现OO的